{"id":689,"date":"2019-03-04T20:37:41","date_gmt":"2019-03-04T12:37:41","guid":{"rendered":"http:\/\/SmokeyDays.top\/wordpress\/?p=689"},"modified":"2019-03-04T20:37:41","modified_gmt":"2019-03-04T12:37:41","slug":"lp4245-%e3%80%90%e6%a8%a1%e6%9d%bf%e3%80%91%e4%bb%bb%e6%84%8f%e6%a8%a1%e6%95%b0ntt","status":"publish","type":"post","link":"http:\/\/SmokeyDays.top\/wordpress\/2019\/03\/04\/lp4245-%e3%80%90%e6%a8%a1%e6%9d%bf%e3%80%91%e4%bb%bb%e6%84%8f%e6%a8%a1%e6%95%b0ntt\/","title":{"rendered":"lp4245 \u3010\u6a21\u677f\u3011\u4efb\u610f\u6a21\u6570NTT"},"content":{"rendered":"\n<p>\u6211\u4eec\u9996\u5148\u8003\u8651\u4e00\u4e2a\u5f88\u66b4\u529b\u7684\u73a9\u6cd5\uff0c\u76f4\u63a5\u627e\u4e00\u4e2a\u5f88\u5927\u5f88\u5927\u5f88\u5927\u7684\u6a21\u6570\uff0c\u7136\u540e\u7528int128\u4e0a\u4e00\u4e2a\u6734\u7d20NTT\uff0c\u518d\u5c06\u7ed3\u679c\u5bf9\u9898\u76ee\u7ed9\u7684\u6a21\u6570\u53d6\u6a21\uff0c\u4f3c\u4e4e\u5c31\u53ef\u4ee5\u4e86\u3002<br>\n\u7136\u800c\u4ed4\u7ec6\u8003\u8651\u4e00\u4e0b\u53d1\u73b0\u8fd9\u4e2a\u505a\u6cd5\u5b9e\u5728\u592a\u66b4\u529b\u4e86\uff08\u624d\u4e0d\u662f\u56e0\u4e3a\u627e\u4e0d\u5230\u5408\u9002\u7684\u6a21\u6570\u5462\u3002\uff09\u6211\u4eec\u8003\u8651\u53e6\u4e00\u79cd\u65b9\u6848\u3002<br>\n\u73b0\u5728\u5047\u8bbe\u6211\u4eec\u5df2\u7ecf\u7528\u597d\u51e0\u79cd\u6a21\u6570\u6c42\u51fa\u6700\u7ec8\u7684\u5404\u79cd\u503c\u4e86\uff0c\u90a3\u4e48\u539f\u503c\u662f\u591a\u5c11\u5462\uff1f\u5f88\u663e\u7136\u53ef\u4ee5\u7528\u4e2d\u56fd\u5269\u4f59\u5b9a\u7406\u6765\u6c42\u51fa\u3002<br>\n\u6211\u4eec\u8ba1\u7b97\u4e86\u4e00\u4e0b\uff0c\u53d1\u73b0\u53ea\u8981\u7528\u4e09\u4e2a\u8d28\u6570\uff0c\u503c\u57df\u5c31\u8db3\u4ee5\u7528\u4e2d\u56fd\u5269\u4f59\u5b9a\u7406\u6c42\u51fa\u6700\u7ec8\u503c\u4e86\u3002<br>\n\u7136\u800c\u6211\u4eec\u77e5\u9053\uff0c\u6a21\u8fd0\u7b97\u6ca1\u6709\u4ea4\u6362\u5f8b\u3002\u6545\u800c\u6211\u4eec\u4e0d\u80fd\u7528\u5e38\u89c4\u7684\u4e2d\u56fd\u5269\u4f59\u5b9a\u7406\u5408\u5e76\uff0c\u5e94\u8be5\u9700\u8981\u4f7f\u7528\u4e00\u79cd\u7c7b\u4f3c\u4e8e\u6269\u5c55\u4e2d\u56fd\u5269\u4f59\u5b9a\u7406\u7684\u9012\u63a8\u5408\u5e76\u65b9\u6cd5\u6765\u5408\u5e76\u5b83\u4eec\u7684\u89e3\u3002 <br>\n\u8fd9\u5c31\u5b8c\u6210\u4e86\u4efb\u610f\u6a21\u6570\u7684NTT\u3002<br>\n\u53e6\u5916\u8981\u6ce8\u610f\u6570\u7ec4\u5927\u5c0f\u2026 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include&lt;iostream>\n#include&lt;cstdio>\n\ninline void Swap(int &amp;A,int &amp;B){\n\tA^=B^=A^=B;\n}\n\ninline long long mlt(long long A,long long X,long long P){\n\tlong long BS=A,RT=0;\n\twhile(X){\n\t\tif(X&amp;1){\n\t\t\tRT+=BS;\n\t\t\tRT%=P;\n\t\t}\n\t\tBS+=BS;\n\t\tBS%=P;\n\t\tX>>=1;\n\t}\n\treturn RT;\n}\n\ninline long long pw(long long A,long long X,long long P){\n\tlong long BS=A,RT=1;\n\twhile(X){\n\t\tif(X&amp;1){\n\t\t\tRT*=BS;\n\t\t\tRT%=P;\n\t\t}\n\t\tBS*=BS;\n\t\tBS%=P;\n\t\tX>>=1;\n\t}\n\treturn RT;\n}\n\nconst long long MOD[3]={469762049,998244353,1004535809};\nconst long long MM=468937312667959297;\nconst long long g0=3,gi[3]={156587350,332748118,334845270};\n\nint L=1,inv[3],R[1&lt;&lt;21|1];\ninline void prpr(int LEN){\n\tint B=0;\n\twhile(L&lt;=LEN){\n\t\tL&lt;&lt;=1;\n\t\t++B;\n\t}\n\tfor(int i=0;i&lt;3;++i){\n\t\tinv[i]=MOD[i]-(MOD[i]-1)\/L;\n\t}\n\tfor(int i=0;i&lt;L;++i){\n\t\tR[i]=R[i>>1]>>1|(i&amp;1)&lt;&lt;(B-1);\n\t}\n}\n\ninline void NTT(int *A,int typ,int P){\n\tfor(int i=0;i&lt;L;++i){\n\t\tif(R[i]&lt;i){\n\t\t\tSwap(A[i],A[R[i]]);\n\t\t}\n\t}\n\tint bs,nw,X,Y,M;\n\tfor(int i=2;i&lt;=L;i&lt;&lt;=1){\n\t\tM=i>>1;\n\t\tbs=pw(~typ?g0:gi[P],(MOD[P]-1)\/i,MOD[P]);\n\t\tfor(int j=0;j&lt;L;j+=i){\n\t\t\tnw=1;\n\t\t\tfor(int k=0;k&lt;M;++k,nw=1ll*nw*bs%MOD[P]){\n\t\t\t\tX=A[j+k],Y=1ll*nw*A[j+k+M]%MOD[P];\n\t\t\t\tA[j+k]=(X+Y)%MOD[P];\n\t\t\t\tA[j+k+M]=(X-Y+MOD[P])%MOD[P];\n\t\t\t}\n\t\t}\n\t}\n}\nint C[1&lt;&lt;21|1],D[1&lt;&lt;21|1],ans[3][1&lt;&lt;21|1];\ninline void FNTT(int *A,int *B,int P){\n\tfor(int i=0;i&lt;L;++i){\n\t\tC[i]=A[i],D[i]=B[i];\n\t}\n\tNTT(C,1,P);\n\tNTT(D,1,P);\n\tfor(int i=0;i&lt;L;++i){\n\t\tC[i]=1ll*C[i]*D[i]%MOD[P];\n\t}\n\tNTT(C,-1,P);\n\tfor(int i=0;i&lt;L;++i){\n\t\tans[P][i]=(int)(1ll*(C[i]+MOD[P])*inv[P]%MOD[P]);\n\t}\n}\nint a[1&lt;&lt;21|1],b[1&lt;&lt;21|1],n,m,p;\nlong long t[3];\nvoid init(){\n\tscanf(\"%d%d%d\",&amp;n,&amp;m,&amp;p);\n\tfor(int i=0;i&lt;=n;++i){\n\t\tscanf(\"%d\",a+i);\n\t}\n\tfor(int i=0;i&lt;=m;++i){\n\t\tscanf(\"%d\",b+i);\n\t}\n\tprpr(n+m);\n\tFNTT(a,b,0);FNTT(a,b,1);FNTT(a,b,2);\n\tt[0]=pw(MOD[1]%MOD[0],MOD[0]-2,MOD[0]);t[1]=pw(MOD[0]%MOD[1],MOD[1]-2,MOD[1]);t[2]=pw(MM%MOD[2],MOD[2]-2,MOD[2]);\/\/\u5206\u522b\u6c42\u51fa\u8981\u7528\u5230\u7684\u4e09\u4e2a\u9006\u5143\u3002 \n\tlong long T1,T2;\n\tfor(int i=0;i&lt;=n+m;++i){\n\t\tT1=(mlt(1ll*ans[0][i]*MOD[1]%MM,t[0],MM)+mlt(1ll*ans[1][i]*MOD[0]%MM,t[1],MM))%MM;\/\/\u76f4\u63a5\u7528CRT\u5408\u5e76\u4e00\u4e8c\u5f0f\u3002 \n\t\tT2=((ans[2][i]-T1)%MOD[2]+MOD[2])%MOD[2]*t[2]%MOD[2];\/\/\u7528EXCRT\u5c06\u7b2c\u4e09\u5f0f\u5408\u5e76\u4e4b\u3002 \n\t\tprintf(\"%d \",(int)(((T2%p)*(MM%p)%p+T1%p)%p));\/\/\u6c42\u5f97\u6700\u7ec8\u89e3\u3002 \n\t}\n}\n\nint main(){\n\tinit();\n\treturn 0;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u4eec\u9996\u5148\u8003\u8651\u4e00\u4e2a\u5f88\u66b4\u529b\u7684\u73a9\u6cd5\uff0c\u76f4\u63a5\u627e\u4e00\u4e2a\u5f88\u5927\u5f88\u5927\u5f88\u5927\u7684\u6a21\u6570\uff0c\u7136\u540e\u7528int128\u4e0a\u4e00\u4e2a\u6734\u7d20NTT\uff0c\u518d\u5c06\u7ed3\u679c\u5bf9\u9898\u76ee &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/SmokeyDays.top\/wordpress\/2019\/03\/04\/lp4245-%e3%80%90%e6%a8%a1%e6%9d%bf%e3%80%91%e4%bb%bb%e6%84%8f%e6%a8%a1%e6%95%b0ntt\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201clp4245 \u3010\u6a21\u677f\u3011\u4efb\u610f\u6a21\u6570NTT\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[96,98,84,85,91,97,24,27,8,6,5],"tags":[],"_links":{"self":[{"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/posts\/689"}],"collection":[{"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":1,"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/posts\/689\/revisions"}],"predecessor-version":[{"id":690,"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/posts\/689\/revisions\/690"}],"wp:attachment":[{"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/media?parent=689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/categories?post=689"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/SmokeyDays.top\/wordpress\/wp-json\/wp\/v2\/tags?post=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}