[SDOI2015] 序列统计
程序员文章站
2022-07-07 21:59:16
由题意可得出递推式$f[i ,j]=\sum_{e\in S} f[i 1,\frac{j}{e}]$,初值$f[0,0]=1$,答案为$f[n,x]$,具体意义不表。 分析可知$f[1,e(e\in S)]=1$,$f[i,ab]=\sum_{a\in S,b\in S}f[i 1,a]f[1,b ......
由题意可得出递推式\(f[i ,j]=\sum_{e\in s} f[i-1,\frac{j}{e}]\),初值\(f[0,0]=1\),答案为\(f[n,x]\),具体意义不表。
分析可知\(f[1,e(e\in s)]=1\),\(f[i,ab]=\sum_{a\in s,b\in s}f[i-1,a]f[1,b]\);
设模数\(m\)(指数)的一个原根为\(g\),构造\(e'=\log_g(e)\in s', e\in s\),改写递推式\(f[1,e'\in s']=1\),\(f[i,a'+b']=\sum_{a',b\in s'}f[i-1,a']f[1,b']\) 。就能套卷积做了*(^e^)*。
做法的正确性:因为\(g^i(0\le i<m-1)\)能取遍\([1,m-1]\)所有数,故\(e\in s\)都有存在唯一在\([0,m-1)\)里的离散对数。
于是此题就是离散快速傅利叶的模板了。
最后谈谈\(g\)的求法很暴力,枚举原根\(g\),然后小大枚举阶(阶的个数是\(o(\sqrt m)\)级的)来判断是否过早地产生循环,如下
int getg(int m) { vector<int> r; for(int i=2; i*i<=m-1; ++i) if((m-1)%i==0) { r.push_back(i); if(i*i!=m-1) r.push_back((m-1)/i); } sort(r.begin(),r.end()); for(int i=2; ; ++i) { bool flag=1; for(auto rr: r) if(fpow(i,rr,m)==1) {flag=0; break;} if(flag) return i; } }
就酱,实现留坑。
上一篇: 去除富文本格式
推荐阅读
-
Crashlytics Android 异常报告统计管理(详解)
-
序列化工具有哪些(序列化和反序列化工具)
-
目前数据统计分析软件有哪些(常见的数据分析工具)
-
Photoshop CS3序列号永久免费分享 最新PS CS3序列码
-
AutoCAD2018激活码序列号大全 CAD2018产品密钥共享
-
Photoshop CS4序列码永久免费分享 最新PS CS4序列号
-
Photoshop CS2注册码永久免费分享 最新PS CS2序列号
-
SQL Server自动生成日期加数字的序列号
-
Autodesk Hsmworks2019中文激活破解安装教程(附序列号)
-
JS字符串统计操作示例【遍历,截取,输出,计算】