正题

题目链接:https://darkbzoj.tk/problem/4589


题目大意

求有多少个长度为\(n\)的数列满足它们都是不大于\(m\)的质数且异或和为\(0\)。


解题思路

两个初始多项式\(F[0]=1\),\(G[prime\leq m]=1\),然后答案就是\(F\ xor\ G^n\)。然后\(\text{FWT}\)之后点值快速幂就好了。

时间复杂度\(O(n\log n)\)

\(\color{white}{写水题有助于背板}\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=(1<<16)+10,P=1e9+7,inv2=(P+1)/2;
ll n,k,m,f[N],g[N];
bool v[N];
void FWT(ll *f,ll op){
if(op==-1)op=inv2;
for(ll p=2;p<=n;p<<=1)
for(ll k=0,len=p>>1;k<n;k+=p)
for(ll i=k;i<k+len;i++){
ll x=f[i],y=f[i+len];
f[i]=(x+y)*op%P;
f[i+len]=(x-y+P)*op%P;
}
return;
}
signed main()
{
while(scanf("%lld%lld",&k,&m)!=EOF){
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
memset(v,0,sizeof(v));
n=1;
while(n<=m)n<<=1;
for(ll i=2;i<=m;i++){
if(!v[i]){
f[i]=1;
for(ll j=i;j<=m;j+=i)
v[j]=1;
}
}
g[0]=1;
FWT(g,1);FWT(f,1);
while(k){
if(k&1){
for(ll i=0;i<n;i++)
g[i]=g[i]*f[i]%P;
}
for(ll i=0;i<n;i++)
f[i]=f[i]*f[i]%P;
k>>=1;
}
FWT(g,-1);
printf("%lld\n",g[0]);
}
return 0;
}

最新文章

  1. Redis所需内存 超过可用内存怎么办
  2. php_cz
  3. css 居中问题
  4. enum 枚举的使用
  5. Linux系统的中断、系统调用和调度概述【转】
  6. ConfigurationManager配置操作
  7. paul的cnblog,欢迎大家的光临
  8. Hadoop源代码导入Eclipse
  9. Wix打包系列(一)如何使用wix制作安装程序
  10. 设计模式原则(2)--Liskov Substitution Principle(LSP)--里氏替换原则
  11. [BZOJ 3813]奇数国
  12. 运算符优先级--C
  13. 文本离散表示(一):词袋模型(bag of words)
  14. Java 多线程之Timer与ScheduledExecutorService
  15. [蓝桥杯]PREV-22.历届试题_国王的烦恼
  16. python 基本模块 random、os、sys
  17. [转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml
  18. 为什么尽量别用 setInterval
  19. 【BZOJ】4894: 天赋
  20. 17.Delete Methods-官方文档摘录

热门文章

  1. flutter添加启动图及设置启动时间
  2. TaskAwaiter&lt;TResult&gt; 结构
  3. asp.net core 声明controller的方法
  4. 【mysql】截取查询分析
  5. MVVMLight学习笔记(四)---RelayCommand初探
  6. MySQL常用权限操作
  7. blog.mzywucai.club停站
  8. const 修饰
  9. 如何打一个RPM包
  10. canvas——绘制解锁图案