ZOJ Problem Set - 3662 Math Magic
2012-10-18 23:23
316 查看
The 2012 ACM-ICPC Asia Changchun Regional Contest-H
题目大意就是给出n,m,k求有多少种方案k个数的和为n,lcm为m。
数据范围DP勉强能接受f[k][i][j]表示已经找出k个数,和为i,lcm为j的方案数。用滚动数组优化内存。
然后因为多组数据还需优化一下,要最后lcm是m,则j一定是m的约束,所以枚举j时枚举m的约束即可。
预处理两个数之间的lcm。
题目大意就是给出n,m,k求有多少种方案k个数的和为n,lcm为m。
数据范围DP勉强能接受f[k][i][j]表示已经找出k个数,和为i,lcm为j的方案数。用滚动数组优化内存。
然后因为多组数据还需优化一下,要最后lcm是m,则j一定是m的约束,所以枚举j时枚举m的约束即可。
预处理两个数之间的lcm。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #define MOD 1000000007 using namespace std; int f[2][1005][1005],lcm[1005][1005],temp[1005]; int gcd(int a,int b){ int r=0; while (b>0) r=a%b,a=b,b=r; return a; } int cnt,tot,n,m,k; int LCM(int a,int b){ return (a*b/gcd(a,b));} int main() { for (int i=1;i<=1000;++i) for (int j=i;j<=1000;++j) lcm[i][j]=lcm[j][i]=LCM(i,j); while (scanf("%d%d%d",&n,&m,&k)!=EOF){ cnt=tot=0; for (int i=1;i<=m;++i) if (m%i==0) temp[tot++]=i; for (int i=0;i<=n;++i) for (int j=0;j<tot;++j) f[cnt][i][temp[j]]=0; for (int i=0;i<tot;++i) f[cnt][temp[i]][temp[i]]=1; for (int t=2;t<=k;++t) { for (int i=0;i<=n;++i) for (int j=0;j<tot;++j) f[1-cnt][i][temp[j]]=0; for (int i=0;i<=n;++i) for (int j=0;j<tot;++j) if (f[cnt][i][temp[j]]) for (int l=0;l<tot;++l) if (i+temp[l]<=n && lcm[temp[j]][temp[l]]<=m){ f[1-cnt][i+temp[l]][lcm[temp[j]][temp[l]]]+=f[cnt][i][temp[j]]; if (f[1-cnt][i+temp[l]][lcm[temp[j]][temp[l]]]>=MOD) f[1-cnt][i+temp[l]][lcm[temp[j]][temp[l]]]-=MOD; } cnt=1-cnt; } cout<<f[cnt] [m]<<endl; } return 0; }
相关文章推荐
- ZOJ Problem Set - 3301 Make Pair
- ZOJ Problem Set - 1002 Fire Net (Python)
- ZOJ Problem Set - 2482||IP Address
- ZOJ Problem Set - 2060 Fibonacci Again
- ZOJ Problem Set - 3204 Connect them
- ZOJ Problem Set - 1006 Do the Untwist
- ZOJ Problem Set - 1029 Moving Tables
- ZOJ Problem Set - 1009 Enigma(待想通)
- ZOJ Problem Set - 2212 Argus
- ZOJ Problem Set - 1019
- ZOJ Problem Set - 1016
- ZOJ Problem Set - 3429 Cube Simulation
- ZOJ Problem Set - 2947 Abbreviation
- ZOJ Problem Set - 1241 Geometry Made Simple
- ZOJ Problem Set - 2857 Image Transformation
- ZOJ Problem Set - 1151 Word Reversal
- ZOJ Problem Set - 3229 Shoot the Bullet 【有上下界网络流+流量输出】
- ZOJ Problem Set - 1006 Do the Untwist
- ZOJ Problem Set - 1009 Enigma
- ZOJ Problem Set - 1025 Wooden Sticks