[2017纪中11-9]乘积 数论+分组背包
2017-11-10 15:20
309 查看
题面
70分显然可以状压每个数分解质因数的情况,DP即可。
正解:考虑一个<=n的数最多有一个>=sqrt(n)的质因子,我们按这个大质因子相同的数分在一组,显然一组中最多选一个,<=sqrt(n)的质因子只有8个,状压即可。f[i][j][s]表示前i组选了j个数,当前乘积分解质因数为s的答案,转移即可。
代码:
70分显然可以状压每个数分解质因数的情况,DP即可。
正解:考虑一个<=n的数最多有一个>=sqrt(n)的质因子,我们按这个大质因子相同的数分在一组,显然一组中最多选一个,<=sqrt(n)的质因子只有8个,状压即可。f[i][j][s]表示前i组选了j个数,当前乘积分解质因数为s的答案,转移即可。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define up(a,b) a=(a+b)%mod #define ll long long using namespace std; const int mod=1000000007; int n,K,pri[100],flag[510],num,tot; ll f[2][185][260]; struct node { int id,s; }a[510],b[510]; bool cmp(node a,node b) { return a.id<b.id; } void getpri(int n) { memset(flag,1,sizeof(flag)); flag[1]=0; for(int i=1;i<=n;i++) { if(flag[i]) pri[++num]=i; for(int j=1;j<=num&&i*pri[j]<=n;j++) { flag[i*pri[j]]=0; if(i%pri[j]==0) break; } } } int main() { getpri(500); tot=100; for(int i=2;i<=500;i++) for(int j=1;j<=num;j++) if(i%pri[j]==0) { if(j<=8) a[i].s|=(1<<(j-1)); else a[i].id=j-8; } a[1].id=1e9; for(int i=2;i<=500;i++) for(int j=1;j<=8;j++) if(i%(pri[j]*pri[j])==0) a[i].id=1e9; for(int i=2;i<=500;i++) if(a[i].id==0) a[i].id=(++tot); int ca; scanf("%d",&ca); while(ca--) { scanf("%d%d",&n,&K); for(int i=1;i<=n;i++) b[i]=a[i]; sort(b+1,b+n+1,cmp); memset(f,0,sizeof(f)); f[0][0][0]=f[0][1][0]=1; int p=1; for(int i=1;i<=180;i++) { int v=(i&1); for(int j=0;j<=min(i+1,K);j++) for(int s=0;s<=255;s++) f[v][j][s]=f[v^1][j][s]; for(;b[p].id==i;p++) for(int j=1;j<=min(i+1,K);j++) for(int s=0;s<=255;s++) if((b[p].s^s)==(b[p].s+s)) up(f[v][j][b[p].s+s],f[v^1][j-1][s]); } ll ans=0; for(int j=0;j<=min(181,K);j++) for(int s=0;s<=255;s++) up(ans,f[0][j][s]); printf("%lld\n",ans-1); } return 0; }
相关文章推荐
- HDU3692--least common multiple(数论优化+分组背包);DP--数论
- [2017纪中11-1]背包 二分
- HDOJ 4345 Permutation(分组背包 + 数论)
- [2017纪中11-2]失格 最小生成树+数论
- 《动态规划》hdoj acm 3.3.4 分组背包
- ***C - I love sneakers!(动态规划,分组背包)
- RQNOJ 金明的预算方案 (分组背包)
- HDU 3535:AreYouBusy(分组背包)
- 【树形DP】【分组背包】【HDU1561】
- HDU 1712 ACboy needs your help 分组背包
- 分组的背包问题
- hdu 1712 分组背包
- bzoj1025 [SCOI2009]游戏(置换+分组背包)
- hdu3535 分组背包的研究
- D 分组背包
- HD3033I love sneakers!(分组背包+不懂)
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- HDU 3033 分组背包
- Ant Counting (poj 3046 分组背包)
- HDU 4501 小明系列故事——买年货 -- 分组背包变体