卡精度的任意模数fft模板题……
这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.
然后我就去网上抄了一下板子……
我打的是最土的任意模数fft,就是fft7次的那种……(好像有很多方法的样子……)
这种任意模数fft方法见http://blog.csdn.net/l_0_forever_lf/article/details/52886397
这道题的具体做法见http://blog.csdn.net/qq_33229466/article/details/78837522
这种方法的思想就是:
  I.既然出题人给出了任意模数的多项式乘法,那么常规ntt肯定是不行
  II.既然他取模,那数会很大,会炸精,常规的fft也不行
  III.既然直接乘会炸精,那我们就把数变小,多跑几次也没关系
(IV.感觉加了一维卷积,有种这种方法很妙,可以继续扩展的感觉,但是很模糊,也说不具体)
本着这种思路,我们逆变换的时候,不能在点值表达式直接操作,最后一遍回去,因为这样效果和没有在一开始把数缩小一样,会炸精.
最后说一下这道题的坑点:如果你不预处理复数,你会炸精.
好像有的人没有预处理,但是用了long double,就没有被卡……
似乎cmath库里有标准库也有类库,而且有的函数两者并不都具有,但是最坑爹的一点是对于sin,cos等函数,cmath标准库的精度大于cmath类库……(这只是我经过亲身试验做出的推测)
反正预处理就没有这些破事……

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <complex>
  5. #include <algorithm>
  6. typedef long long LL;
  7. typedef double db;
  8. typedef std::complex<db> cd;
  9. const int N=;
  10. const db Pai=acos((db)-);
  11. const int P=;
  12. cd a1[N],b1[N],a2[N],b2[N],c1[N],c2[N],c3[N],w1[N],w2[N];
  13. int rev[N],len;
  14. int ai[N],bi[N],ans[N],ni[N];
  15. inline void fft(cd *C,int opt,cd *wn){
  16. register int i,j,k;cd temp;
  17. for(i=;i<len;++i)if(rev[i]>i)std::swap(C[i],C[rev[i]]);
  18. for(k=;k<=len;k<<=){
  19. for(i=;i<len;i+=k){
  20. for(j=;j<(k>>);++j){
  21. temp=C[i+j+(k>>)]*wn[len/k*j];
  22. C[i+j+(k>>)]=C[i+j]-temp;
  23. C[i+j]+=temp;
  24. }
  25. }
  26. }
  27. if(opt==-){
  28. db inv=./len;
  29. for(i=;i<len;++i)C[i]*=inv;
  30. }
  31. }
  32. inline void Mul(int *a,int *b,int *c,int n){
  33. len=;
  34. while(len<n)len<<=;
  35. int i,sqr=sqrt(P);
  36. cd temp;
  37. for(i=;i<len;++i)rev[i]=(rev[i>>]>>)|((i&)?(len>>):);
  38. for(i=;i<len;++i){
  39. w1[i]=cd(std::cos(.*Pai/len*i),std::sin(.*Pai/len*i));
  40. w2[i]=cd(std::cos(-.*Pai/len*i),std::sin(-.*Pai/len*i));
  41. }
  42. for(i=;i<len;++i){
  43. a1[i]=ai[i]/sqr,b1[i]=ai[i]%sqr;
  44. a2[i]=bi[i]/sqr,b2[i]=bi[i]%sqr;
  45. }
  46. fft(a1,,w1),fft(b1,,w1),fft(a2,,w1),fft(b2,,w1);
  47. for(i=;i<len;++i){
  48. c1[i]=a1[i]*a2[i];
  49. c2[i]=a1[i]*b2[i]+a2[i]*b1[i];
  50. c3[i]=b1[i]*b2[i];
  51. }
  52. fft(c1,-,w2),fft(c2,-,w2),fft(c3,-,w2);
  53. for(i=;i<len;++i)
  54. c[i]=((LL)(round(c1[i].real()))%P*sqr%P*sqr%P+(LL)(round(c2[i].real()))%P*sqr%P+(LL)(round(c3[i].real()))%P)%P;
  55. }
  56. int main(){
  57. int n,k,i;
  58. scanf("%d%d",&n,&k);
  59. for(i=;i<n;++i)scanf("%d",&ai[i]);
  60. bi[]=;
  61. for(i=;i<n;++i)
  62. bi[i]=(LL)bi[i-]*(k+i-)%P*(i==?ni[i]=:ni[i]=(-(LL)(P/i)*ni[P%i]%P+P)%P)%P;
  63. Mul(ai,bi,ans,n<<);
  64. for(i=;i<n;++i)printf("%d\n",ans[i]);
  65. return ;
  66. }

51nod 1172 Partial Sums V2 卡精度的任意模数FFT的更多相关文章

  1. 51nod 1172 Partial Sums V2

    题目 给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}.如果对生成的数组S再进行一次累加操作 ...

  2. 【51nod】1123 X^A Mod B (任意模数的K次剩余)

    题解 K次剩余终极版!orz 写一下,WA一年,bug不花一分钱 在很久以前,我还认为,数论是一个重在思维,代码很短的东西 后来...我学了BSGS,学了EXBSGS,学了模质数的K次剩余--代码一个 ...

  3. 51nod1172 Partial Sums V2

    推一下式子发现是裸的FFT,$ans[k]=\sum_{i}\sum_{j}[i+j=k]a[i]*C_{m-1+j}^{j}$ 比较坑爹的就是这个模数,于是我们上任意模数的FFT 任意模数的FFT目 ...

  4. 51nod 1161 Partial Sums

    给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}.如果对生成的数组S再进行一次累加操作,{1 ...

  5. 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]

    1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...

  6. CF思维联系–CodeForces - 223 C Partial Sums(组合数学的先线性递推)

    ACM思维题训练集合 You've got an array a, consisting of n integers. The array elements are indexed from 1 to ...

  7. 51nod1161 Partial Sums

    开始想的是O(n2logk)的算法但是显然会tle.看了解题报告然后就打表找起规律来.嘛是组合数嘛.时间复杂度是O(nlogn+n2)的 #include<cstdio> #include ...

  8. Non-negative Partial Sums(单调队列)

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  9. hdu 4193 Non-negative Partial Sums 单调队列。

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

随机推荐

  1. POSTMan 快速上手(一图带你玩 Postman )

    POSTMan 快速上手(一图带你玩 Postman ):

  2. TPO-12 C2 A problem of the TA's payroll

    TPO-12 C2 A problem of the TA's payroll payroll n. 工资单:在册职工人数:工资名单: paycheck n. 付薪水的支票,薪水 paperwork ...

  3. 中文乱码的处理—@北河的ppt

  4. LeeCode第一次刷题(两数相加)

    题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...

  5. SpringBoot项目打包成jar后,启动脚本

    将springboot项目打包成jar后,上传至服务器,每次都需要手敲命令,重新部署项目,可将这些命令写入脚本中,直接运行. 启动脚本(start.sh): CUR_PATH=$(cd "$ ...

  6. HDU 3264/POJ 3831 Open-air shopping malls(计算几何+二分)(2009 Asia Ningbo Regional)

    Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...

  7. fragment的介绍与使用

    稍稍摘录一段Fragment.java中的说明文档. /** * A Fragment is a piece of an application's user interface or behavio ...

  8. 自测之Lesson7:设备文件操作

    题目:请编写一个输入密码(不回显)的程序,要求通过设置终端来完成. 完成代码: #include <stdio.h> #include <unistd.h> #include ...

  9. tomcat端口号修改

    修改Tomcat的端口号: 在默认情况下,tomcat的端口是8080,如果出现8080端口号冲突,用如下方法可以修改Tomcat的端口号: 首先: 在Tomcat的根(安装)目录下,有一个conf文 ...

  10. Khan Academy

    Khan Academy是一个免费的学院. 致力于教育改革. 百度百科:ohn Resig 百度百科有记者采访,采访内容比较有意思.