ntt

NTT学习笔记

冷暖自知 提交于 2020-03-24 14:16:34
和 \(FFT\) 相对应的,把单位根换成了原根,把共轭复数换成了原根的逆元,最后输出的时候记得乘以原 \(N\) 的逆元即可. #include <bits/stdc++.h> using namespace std; #define LL long long const int MAXN = 3 * 1e6 + 10, P = 998244353, G = 3; LL a[MAXN], b[MAXN]; int N, M, limit = 1, L, r[MAXN], Gi; inline LL fastpow(LL a, LL k) { LL base = 1; while(k) { if(k & 1) base = (base * a ) % P; a = (a * a) % P; k >>= 1; } return base % P; } inline void NTT(LL *A, int type) { for (int i = 0; i < limit; i++) { if(i < r[i]) swap(A[i], A[r[i]]); } for (int mid = 1; mid < limit; mid <<= 1) { LL Wn = fastpow (type == 1 ? G : Gi , (P - 1) / (mid << 1)); for(int j

日本已开始提供10Gbps万兆光纤接入服务

早过忘川 提交于 2020-03-15 12:02:48
5G的理论下载速度已达千兆,所以,有线宽带怎敢落后。据外媒报道,日本运营商NTT East和NTT West已开始提供10Gbps万兆光纤接入服务,月费约380元人民币。 不过,万兆接入需要配套FLET Hikari Cross无线路由器,月费500日元,约31元人民币。官方称,这款路由支持Wi-Fi6。 目前,NTT East的万兆接入已覆盖日本东京足立区、杉井区、江户川、练马区、世田谷区、葛饰区、大田区和板桥区,NTT West则面向大阪和名古屋服务。 考虑到2020东京奥运会将于72月24日到8月9日举办,4K/8K流媒体服务占主导,相信万兆宽带届时将大展拳脚。 对比之下,国内千兆宽带月费通常也在200元以上,不过多以4G/5G融合套餐的形式出现。 来源: oschina 链接: https://my.oschina.net/linuxmeng/blog/3195244

ntt板子

倖福魔咒の 提交于 2020-03-08 21:39:40
优化了一下板子,现在luogu多项式求逆模板只需要400ms- #include<bits/stdc++.h> using namespace std; #define mo 998244353 #define N 300010 #define ll unsigned long long #define pl vector<int> int qp(int x,int y){ int r=1; for(;y;y>>=1,x=1ll*x*x%mo) if(y&1)r=1ll*r*x%mo; return r; } int n,k,rev[N],v,c,le,w[N]; ll b[N]; vector<int>a; void deb(pl x){ for(int i:x)cout<<i<<' '; puts(""); } void init(int n){ v=1; le=0; while(v<n)le++,v*=2; for(signed i=0;i<v;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(le-1)); int g=qp(3,(mo-1)/v); w[v/2]=1; for(int i=v/2+1;i<v;i++) w[i]=1ull*w[i-1]*g%mo; for(signed i=v/2-1;~i;i--) w[i]=w[i*2]; }

#NTT,原根#洛谷 3321 [SDOI2015]序列统计

十年热恋 提交于 2020-02-14 18:03:27
JZOJ 4051 From 2020.02.13【NOIP提高组】模拟A组 题目 分析 首先朴素dp方程 设 \(dp[i][j]\) 表示 \(i\) 个数的数列乘积为 \(j\) 的方案 那么 \(dp[i][j*a[k]\bmod m]=itself+dp[i-1][j]\) 这可以用矩阵乘法优化到 \(O(m^3log_2n)\) ,然而考场真的不想写 其实这个方程不明显,考虑到 \(n\) 超级大,不是矩阵乘法就是快速幂(推测) 能不能用2的多少次方拼凑出长度为 \(n\) 的数列 刚刚的方程可以变为 \[dp[2*i][t]=\sum_{x*y\bmod m==t}dp[i][x]+dp[i][y]\] 那乘法怎么办呢,用原根把乘法变成加法,那就可以用NTT做了 至于原根我不好解释,但是原根会比较小, 具体做法就是 \(g^k\neq 1(k|p-1)\) 那么 \(g\) 就是 \(p\) 的一个原根(准确来说应该是 \(\varphi(p)\) ,但是这里是质数) 代码 #include <cstdio> #include <cctype> #include <algorithm> #define rr register using namespace std; const int mod=1004535809,invG=334845270,N=8011; int

洛谷 P2791 幼儿园篮球题

让人想犯罪 __ 提交于 2020-02-09 00:09:52
洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是: \(\sum_{i=0}^kC_m^iC_{n-m}^{k-i}i^L\) 这个 \(i^L\) 很烦,就把第二类斯特林数的式子套进去 \(\sum_{i=0}^kC_m^iC_{n-m}^{k-i}i^L\) \(\sum_{i=0}^kC_m^iC_{n-m}^{k-i}\sum_{j=0}^iC_{i}^j\begin{Bmatrix}L\\j\end{Bmatrix}j!\) \(\sum_{j=0}^k\begin{Bmatrix}L\\j\end{Bmatrix}j!\sum_{i=j}^kC_m^iC_{n-m}^{k-i}C_{i}^j\) 后面 \(\sum\) 三个组合数好像很不好搞,但是 \(C_{m}^{i}C_{i}^{j}=C_{m}^{j}C_{m-j}^{i-j}\) ,可以拆出一个与 \(i\) 无关的组合数 \(\sum_{j=0}^k\begin{Bmatrix}L\\j\end{Bmatrix}j!C_{m}^{j}\sum_{i=j}^kC_{m-j}^{i-j}C_{n-m}^{k-i}\) 把式子化的好看一点,发现可以套范德蒙德卷积( \(\sum_{i=0}^kC_{n}^{i

Stirling数

让人想犯罪 __ 提交于 2020-02-04 02:53:57
第一类 \(Stirling\) 数 \(\begin{bmatrix} n \\ m \\ \end{bmatrix}\) 表示 \(n\) 个元素组成 \(m\) 个圆排列的方案数。 何为圆排列?即通过排列在一个环上,两两不能通过旋转相互得到的排列的个数。 \[ \begin{bmatrix} n \\ m \\ \end{bmatrix}=\begin{bmatrix} n-1 \\ m-1 \\ \end{bmatrix}+(n-1)\cdot \begin{bmatrix} n-1 \\ m \\ \end{bmatrix} \] \[ \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix}=1, \begin{bmatrix} n \\ 0 \\ \end{bmatrix}=0(n>0) \] 递推考虑加入的元素要不重新成一个排列,要不放在已有的任一个元素后。 性质 \[ (n-1)!=\begin{bmatrix} n \\ 1 \\ \end{bmatrix} \] 圆排列性质 \[ n!=\sum_{i=0}^{n}\begin{bmatrix} n \\ i \\ \end{bmatrix} \] 置换与圆排列关系 \[ \begin{bmatrix} n \\ 2 \\ \end{bmatrix}=(n-1)!\cdot \sum_{i

多项式全家桶学习笔记

☆樱花仙子☆ 提交于 2020-02-01 18:13:00
Upd: \(2020/2/1\) ,更新了多项式带余除法 To do list: 多项式牛顿迭代 多项式 \(ln\) , \(exp\) 多项式快速幂 \(\cdots\) 应该会不定期更的...... 多项式求逆 还是看板子: 【模板】多项式乘法逆 给一个 \(n-1\) 次 \(n\) 项柿 \(F(x)\) ,要你求一个 \(n-1\) 次多项式 \(G(x)\) ,满足 \(F(x)G(x)\equiv 1 \ (mod \ x^n)\) 。 就是把 \(F(x)G(x)\) 卷积起来忽略掉次数 \(\ge n\) 的项后它 \(\equiv 1\) 。 一个比较难的情况: \(n = 1\) ,即 \(F(x)G(x)\) 的常数项为 \(1\) ,答案就是 \(F[0]^{-1}\) ,( \(F\) 的常数项的逆元),怎么样,难吧! 好我们下面来看更一般的情况 \[ F(x)G(x) \equiv 1 \ (mod \ x^n) \] 假设我们现在已经知道了 \[ F(x)G'(x) \equiv 1 \ (mod \ x^{\left\lceil \frac{n}{2} \right\rceil}) \] 那么由于 \(F(x)G(x) \equiv 1 \ (mod \ x^n)\) ,所以 \(F(x)G(x)\) 必定 \(\equiv 1 \ (mod

HDU-6036 Division Game(ntt模板)

一曲冷凌霜 提交于 2020-01-30 12:55:34
题面 Description There are \(k\) piles of stones in a circle, numbered from \(0\) to \(k - 1\) , where the number of the stones in each pile is \(n\) initially. You can do some round operations, where the initial round is numbered as the \(1\) -st round. The operation of the \(i\) -th round is to modify the pile of stones numbered \((i - 1) \bmod k\) . In each round, you should remove from this pile some stones (at least one stone), satisfying that the number of stones in this pile before this operation is a multiple of the number of stones in this pile after operation, which means that you

BZOJ 5510: [Tjoi2019]唱、跳、rap和篮球 OGF+NTT

浪子不回头ぞ 提交于 2020-01-29 16:37:37
十分轻松的生成函数题. code: #include <cmath> #include <cstring> #include <algorithm> #include <cstdio> #include <string> #define ll long long #define ull unsigned long long using namespace std; namespace IO { char buf[100000],*p1,*p2; #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++) int rd() { int x=0; char s=nc(); while(s<'0') s=nc(); while(s>='0') x=(((x<<2)+x)<<1)+s-'0',s=nc(); return x; } void print(int x) {if(x>=10) print(x/10);putchar(x%10+'0');} void setIO(string s) { string in=s+".in"; string out=s+".out"; freopen(in.c_str(),"r",stdin); // freopen(out.c_str(),"w"

LOJ泛做

萝らか妹 提交于 2020-01-22 23:45:49
SDOI2019 快速查询 考虑维护双标记,题目的难点在于如何维护单点赋值操作。 推式子发现,直接修改原本的值变为$\frac{x-add}{mul}$,用hash维护下标即可。 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define MOD 10000019 4 namespace hash{ 5 #define sz 299999 6 int h[300010], num[300010], clo[300010]; 7 int All, CLO; 8 inline int get_Num(int x) { 9 int wt = x % sz; 10 while(num[wt] != x && num[wt]) { 11 ++ wt; 12 if(wt == sz) wt = 0; 13 } 14 num[wt] = x; 15 return wt; 16 } 17 inline int upd(int x, int y, int CL) { 18 int wt = get_Num(x); 19 if(clo[wt] < CLO) h[wt] = All; 20 int ret = y - h[wt]; 21 h[wt] = y; clo[wt] = CL; 22 return ret; 23 } 24 inline