bzoj4197
2016-07-10 20:50
211 查看
这题现场想的思路方向都是对的,但限于现场和实力因素没能A
很显然我们会想到质因数的选取
如果某个质数p被W选了,那G就不能选含有质因子p的数
因此我们不难想到状压质数的选取情况,令f[i][j]为w质数选取状态为i,g质数选取状态j的方案数
但是500以内质数太多了怎么办?我们考虑大质数能不能分开考虑
考虑到sqrt(500)以外的质数,他们在每个数中最多出现一次,因此我们只要按这些质数分类做dp即可
这样需要状压的质数只有2,3,5,7,11,13,17,23这8个了,这样就可以解决了
具体的,我用state表示每个数前8个质数的含有情况,res表示除去前8个质数剩下的数
然后按照res排序做dp即可
View Code
很显然我们会想到质因数的选取
如果某个质数p被W选了,那G就不能选含有质因子p的数
因此我们不难想到状压质数的选取情况,令f[i][j]为w质数选取状态为i,g质数选取状态j的方案数
但是500以内质数太多了怎么办?我们考虑大质数能不能分开考虑
考虑到sqrt(500)以外的质数,他们在每个数中最多出现一次,因此我们只要按这些质数分类做dp即可
这样需要状压的质数只有2,3,5,7,11,13,17,23这8个了,这样就可以解决了
具体的,我用state表示每个数前8个质数的含有情况,res表示除去前8个质数剩下的数
然后按照res排序做dp即可
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<stdlib.h> #include<algorithm> using namespace std; const int sp[8]={2,3,5,7,11,13,17,19}; struct node{int res,st;} a[510]; int f[256][256],g[2][256][256]; int ans,n,p; bool cmp(node a,node b) { return a.res<b.res; } int main() { scanf("%d%d",&n,&p); for (int i=2; i<=n; i++) { int x=i; for (int j=0; j<8; j++) if (x%sp[j]==0) { a[i].st+=1<<j; while (x%sp[j]==0) x/=sp[j]; } a[i].res=x; } sort(a+2,a+1+n,cmp); f[0][0]=g[0][0][0]=g[1][0][0]=1; for (int i=2; i<=n; i++) { memcpy(g[0],f,sizeof(f)); memcpy(g[1],f,sizeof(f)); for (int u=0; u<256; u++) for (int v=0; v<256; v++) if ((u&v)==0) { if ((a[i].st&v)==0) g[0][u|a[i].st][v]=(g[0][u|a[i].st][v]+f[u][v])%p; if ((a[i].st&u)==0) g[1][u][v|a[i].st]=(g[1][u][v|a[i].st]+f[u][v])%p; } if (a[i].res!=1) { int j; for (j=i+1; j<=n&&a[j].res==a[i].res; j++) for (int u=255;u>=0;u--) for (int v=255;v>=0;v--) if ((u&v)==0) { if ((a[j].st&v)==0) g[0][u|a[j].st][v]=(g[0][u|a[j].st][v]+g[0][u][v])%p; if ((a[j].st&u)==0) g[1][u][v|a[j].st]=(g[1][u][v|a[j].st]+g[1][u][v])%p; } i=j-1; } for (int u=0; u<256; u++) for (int v=0; v<256; v++) f[u][v]=((g[0][u][v]+g[1][u][v]-f[u][v])%p+p)%p; } for (int i=0; i<=255; i++) for (int j=0; j<=255; j++) if ((i&j)==0) ans=(ans+f[i][j])%p; printf("%d\n",ans); return 0; }
View Code
相关文章推荐
- This cache store does not support tagging
- cocos2d-x 3.x学习之声音系统
- 欢迎使用CSDN-markdown编辑器
- 读懂 Android 中的代码混淆
- JAVA 复制文件夹(含子目录)
- 个人总结之MSP430F5510串口通讯(485)
- 推荐几个机器学习算法及应用领域相关的中国大牛
- JTextField实现默认提示
- Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结
- UOJ35 后缀数组(模板)
- UITableView优化方案
- Android中的HttpURLConnection网络请求方式
- Subsets II
- 更新Ubuntu Kylin源遇到问题
- 0710学习记录
- Tomcat中内置DBCP数据库连接池使用
- redhat6.5搭建nginx+tomcat负载均衡,memcached高速缓存
- 继承
- 简单汇编反编译例子
- nyoj 275 队花的烦恼一