其实是分治ntt,因为fft会爆精度,真*裸题

分治过程和fft的一模一样,主要就是ntt精度高,用原根来代替fft中的\(w_n^k\)

1.定义:设m>1,(a,m)==1,满足\(a^r=1(modm)\)的最小r是\(\phi(r)\),那么a就是m的原根

2.性质:如果g是p原根,那么\(g^1,g^2...g^(p-1)\)是1到p-1的排列,各不相同

对于\(g^k=x(mod p)\),我们记I(x)=k,

有\(I(a*b)=I(a)*I(b)(mod p-1),I(a^k)=kI(a)(mod p-1)\)

3.求法:求原根的话就是找到一个g,对于\(p-1=p_1^{k_1}*p_2^{k_2}***p_x^{k_x}\),都有\(g^{\frac{p-1}{p_i}}!=1(1<=i<=k)\)

直接遍历即可,因为原根不是很大

  1. //#pragma GCC optimize(2)
  2. //#pragma GCC optimize(3)
  3. //#pragma GCC optimize(4)
  4. //#pragma GCC optimize("unroll-loops")
  5. //#pragma comment(linker, "/stack:200000000")
  6. //#pragma GCC optimize("Ofast,no-stack-protector")
  7. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  8. #include<bits/stdc++.h>
  9. #define fi first
  10. #define se second
  11. #define db double
  12. #define mp make_pair
  13. #define pb push_back
  14. #define pi acos(-1.0)
  15. #define ll long long
  16. #define vi vector<int>
  17. #define mod 998244353
  18. #define ld long double
  19. #define C 0.5772156649
  20. #define ls l,m,rt<<1
  21. #define rs m+1,r,rt<<1|1
  22. #define pll pair<ll,ll>
  23. #define pil pair<int,ll>
  24. #define pli pair<ll,int>
  25. #define pii pair<int,int>
  26. //#define cd complex<double>
  27. #define ull unsigned long long
  28. #define base 1000000000000000000
  29. #define Max(a,b) ((a)>(b)?(a):(b))
  30. #define Min(a,b) ((a)<(b)?(a):(b))
  31. #define fin freopen("a.txt","r",stdin)
  32. #define fout freopen("a.txt","w",stdout)
  33. #define fio ios::sync_with_stdio(false);cin.tie(0)
  34. template<typename T>
  35. inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
  36. template<typename T>
  37. inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
  38. inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
  39. inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
  40. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  41. inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
  42. inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
  43. using namespace std;
  44. const double eps=1e-8;
  45. const ll INF=0x3f3f3f3f3f3f3f3f;
  46. const int N=200000+10,maxn=400000+10,inf=0x3f3f3f3f;
  47. ll x[N<<3],y[N<<3];
  48. int rev[N<<3];
  49. void getrev(int bit)
  50. {
  51. for(int i=0;i<(1<<bit);i++)
  52. rev[i]=(rev[i>>1]>>1) | ((i&1)<<(bit-1));
  53. }
  54. void ntt(ll *a,int n,int dft)
  55. {
  56. for(int i=0;i<n;i++)
  57. if(i<rev[i])
  58. swap(a[i],a[rev[i]]);
  59. for(int step=1;step<n;step<<=1)
  60. {
  61. ll wn=qp(3,(mod-1)/(step*2));
  62. if(dft==-1)wn=qp(wn,mod-2);
  63. for(int j=0;j<n;j+=step<<1)
  64. {
  65. ll wnk=1;
  66. for(int k=j;k<j+step;k++)
  67. {
  68. ll x=a[k];
  69. ll y=wnk*a[k+step]%mod;
  70. a[k]=(x+y)%mod;a[k+step]=(x-y+mod)%mod;
  71. wnk=wnk*wn%mod;
  72. }
  73. }
  74. }
  75. if(dft==-1)
  76. {
  77. ll inv=qp(n,mod-2);
  78. for(int i=0;i<n;i++)a[i]=a[i]*inv%mod;
  79. }
  80. }
  81. ll dp[N],a[N];
  82. void cdq(int l,int r)
  83. {
  84. if(l==r)return ;
  85. int m=(l+r)>>1;
  86. cdq(l,m);
  87. int sz=0;
  88. while((1<<sz)<=(r-l+1))sz++;sz++;
  89. getrev(sz);int len=(1<<sz);
  90. for(int i=0;i<=len;i++)x[i]=y[i]=0;
  91. for(int i=l;i<=m;i++)x[i-l]=dp[i];
  92. for(int i=1;i<=r-l;i++)y[i-1]=a[i];
  93. ntt(x,len,1),ntt(y,len,1);
  94. for(int i=0;i<=len;i++)x[i]=x[i]*y[i]%mod;
  95. ntt(x,len,-1);
  96. for(int i=m+1;i<=r;i++)
  97. {
  98. dp[i]+=x[i-l-1]%mod;
  99. dp[i]%=mod;
  100. }
  101. cdq(m+1,r);
  102. }
  103. int main()
  104. {
  105. int n;scanf("%d",&n);
  106. dp[0]=1;
  107. for(int i=1;i<n;i++)
  108. {
  109. scanf("%lld",&a[i]);
  110. a[i]%=mod;dp[i]=0;
  111. }
  112. cdq(0,n-1);
  113. for(int i=0;i<n;i++)printf("%lld ",dp[i]);puts("");
  114. return 0;
  115. }
  116. /********************
  117. ********************/

求原根

  1. //#pragma GCC optimize(2)
  2. //#pragma GCC optimize(3)
  3. //#pragma GCC optimize(4)
  4. //#pragma GCC optimize("unroll-loops")
  5. //#pragma comment(linker, "/stack:200000000")
  6. //#pragma GCC optimize("Ofast,no-stack-protector")
  7. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  8. #include<bits/stdc++.h>
  9. #define fi first
  10. #define se second
  11. #define db double
  12. #define mp make_pair
  13. #define pb push_back
  14. #define pi acos(-1.0)
  15. #define ll long long
  16. #define vi vector<int>
  17. #define mod 1000000007
  18. #define ld long double
  19. #define C 0.5772156649
  20. #define ls l,m,rt<<1
  21. #define rs m+1,r,rt<<1|1
  22. #define pll pair<ll,ll>
  23. #define pil pair<int,ll>
  24. #define pli pair<ll,int>
  25. #define pii pair<int,int>
  26. //#define cd complex<double>
  27. #define ull unsigned long long
  28. #define base 1000000000000000000
  29. #define Max(a,b) ((a)>(b)?(a):(b))
  30. #define Min(a,b) ((a)<(b)?(a):(b))
  31. #define fin freopen("a.txt","r",stdin)
  32. #define fout freopen("a.txt","w",stdout)
  33. #define fio ios::sync_with_stdio(false);cin.tie(0)
  34. template<typename T>
  35. inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
  36. template<typename T>
  37. inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
  38. inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
  39. inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
  40. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  41. inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
  42. inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
  43. using namespace std;
  44. const double eps=1e-8;
  45. const ll INF=0x3f3f3f3f3f3f3f3f;
  46. const int N=200000+10,maxn=400000+10,inf=0x3f3f3f3f;
  47. int main()
  48. {
  49. ll n,p;scanf("%lld",&n);
  50. vi v;p=n-1;
  51. for(ll i=2;i*i<=p;i++)
  52. {
  53. if(p%i==0)
  54. {
  55. v.pb(i);
  56. while(p%i==0)p/=i;
  57. }
  58. }
  59. if(p!=1)v.pb(p);
  60. for(int i=1;i<=n;i++)
  61. {
  62. bool ok=1;
  63. for(int j=0;j<v.size();j++)
  64. if(qp(i,(n-1)/v[j],n)==1)
  65. ok=0;
  66. if(ok)return 0*printf("%d\n",i);
  67. }
  68. return 0;
  69. }
  70. /********************
  71. ********************/

P4721 【模板】分治 FFT的更多相关文章

  1. 洛谷 P4721 [模板]分治FFT —— 分治FFT / 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4721 分治做法,考虑左边对右边的贡献即可: 注意最大用到的 a 的项也不过是 a[r-l] ,所以 NTT 可以 ...

  2. 洛谷.4721.[模板]分治FFT(NTT)

    题目链接 换一下形式:\[f_i=\sum_{j=0}^{i-1}f_jg_{i-j}\] 然后就是分治FFT模板了\[f_{i,i\in[mid+1,r]}=\sum_{j=l}^{mid}f_jg ...

  3. 解题:洛谷4721 [模板]分治FFT

    题面 这是CDQ入门题,不要被题目名骗了,这核心根本不在不在FFT上啊=.= 因为后面的项的计算依赖于前面的项,不能直接FFT.所以用CDQ的思想,算出前面然后考虑给后面的贡献 #include< ...

  4. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  5. P4721【模板】分治 FFT

    瞎扯 虽然说是FFT但是还是写了一发NTT(笑) 然后忘了IDFT之后要除个n懵逼了好久 以及递归的时候忘了边界无限RE 思路 朴素算法 分治FFT 考虑到题目要求求这样的一个式子 \[ F_x=\S ...

  6. [洛谷P4721]【模板】分治 FFT

    题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$f_i=\sum_{j=1}^if_{i-j}g_j\\f_0=1$$ 题解:直接求复杂度是$O(n^ ...

  7. 洛谷P4721 【模板】分治 FFT(分治FFT)

    传送门 多项式求逆的解法看这里 我们考虑用分治 假设现在已经求出了$[l,mid]$的答案,要计算他们对$[mid+1,r]$的答案的影响 那么对右边部分的点$f_x$的影响就是$f_x+=\sum_ ...

  8. 洛谷P4721 【模板】分治 FFT(生成函数+多项式求逆)

    传送门 我是用多项式求逆做的因为分治FFT看不懂…… upd:分治FFT的看这里 话说这个万恶的生成函数到底是什么东西…… 我们令$F(x)=\sum_{i=0}^\infty f_ix^i,G(x) ...

  9. [题解] Luogu P4721 【模板】分治 FFT

    分治FFT的板子为什么要求逆呢 传送门 这个想法有点\(cdq\)啊,就是考虑分治,在算一段区间的时候,我们把他分成两个一样的区间,然后先做左区间的,算完过后把左区间和\(g\)卷积一下,这样就可以算 ...

  10. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

随机推荐

  1. js 操作数字类型

    1.内置函数 Number().parseInt().parseFloat() var num = "88.88abc888"; Number(num);              ...

  2. AtCoder Beginner Contest 086 D - Checker

    Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement AtCoDeer is thinking o ...

  3. nginx配置https并强制http自动跳转到https

    关于使用HTTPS/SSL的必要性,可以自行baidu,援引的说法,EFF(Electronic Frontier Foundation),全球过半流量采用https. https://www.osc ...

  4. Github使用教程(二)------ Github客户端使用方法

    在上一篇教程中,我们简单介绍了Github网站的各个部分,相信大家对Github网站也有了一个初步的了解(/(ㄒoㄒ)/~~可是还是不会用怎么办),不要着急,我们今天先讲解一下Github for w ...

  5. 06: linux下python开发环境梳理

    1.1 修改~/.bashrc文件 改编终端颜色 alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # User specific aliases ...

  6. 20145331魏澍琛《网络对抗》Exp5 MSF基础应用

    20145331魏澍琛<网络对抗>Exp5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit:渗透攻击的模块合集,将真正 ...

  7. Java求两个数平均值

    如何正确的求2个数的平均值.在练习算法二分查找的时候发现的,以前没有注意到的bug 备注:数据以int类型为例 一.以前的通用写法 /** * 求a+b平均值 * @param a * @param ...

  8. linux内核启动参数解析及添加

    1.环境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x ...

  9. HttpClient 的使用

    HttpClient使用: maven: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient ...

  10. CodeForces 1105E

    题目链接 std:meet in the middle 首先把所有的点分成两部分,设\(f_i\)为前半部分在点集\(i\)中选出的最大独立集,\(g\)为在后半部分选.这个可以在\(O(2^{m/2 ...