HDU 4427 Math Magic(DP)
如果在现场赛,基本做不出。。。
这个题目感觉还是很有质量的,本来就知道这个题是DP,所以看题的时候就主动往状态转移上靠,然后看完之后觉得这个题很水啊。。。前i个的和为j,然后通过每一位上的因子递推就行了,然后就SB的敲了一个代码,WA了,想了一下,额,这种想法是错的。。。这样不能保证LCM = m,怎么才能保证LCM呢。。。想啊想,搞了一个更2的方法,状态还是刚那个样子,然后用组合的方式去枚举两个数,保证LCM = m,然后拍了一会,发现也不对,有重复的啊,难道要容斥。。。然后终于想到可以再加一维,带着当前状态的LCM转移,前i个和为j,当前的lcm为k,这样就可以了。。。4个for的复杂度+各种二货错误+卡内存 = 各种乱改+1MLE+2WA+2RE+2TLE,滚动数组滚的我纠结啊,终于1968ms卡过了。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 using namespace std; 7 #define LL __int64 8 #define MOD 1000000007 9 LL dp1[1001][101],dp2[1001][101]; 10 int o[1001],fact[101]; 11 int ll[1001][1001]; 12 int gcd(int a,int b) 13 { 14 return b == 0?a:gcd(b,a%b); 15 } 16 int lcm(int a,int b) 17 { 18 if(ll[a][b] > 0)//记忆化一下 19 return ll[a][b]; 20 else 21 { 22 ll[a][b] = a*b/gcd(a,b); 23 return ll[a][b]; 24 } 25 } 26 int main() 27 { 28 int i,j,u,q,n,m,k,num,temp; 29 LL ans; 30 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 31 { 32 num = 1; 33 memset(o,0,sizeof(o)); 34 if(k == 1)//这个特判 居然写错了。。。 35 { 36 if(n == m) 37 printf("%d\n",1); 38 continue; 39 } 40 if(k == 2) 41 { 42 ans = 0; 43 for(i = 1; i <= n-1; i ++) 44 { 45 if(lcm(i,n-i) == m) 46 ans ++; 47 } 48 printf("%I64d\n",ans); 49 continue; 50 } 51 for(i = 1; i <= m; i ++) 52 { 53 if(m%i == 0) 54 { 55 fact[num] = i; 56 o[i] = num; 57 num ++; 58 } 59 } 60 for(i = 0; i <= n; i ++) 61 { 62 for(j = 0; j <= num-1; j ++) 63 { 64 dp1[i][j] = 0; 65 dp2[i][j] = 0; 66 } 67 } 68 for(i = 1; i <= num-1; i ++) 69 { 70 dp1[fact[i]][i] = 1; 71 } 72 for(i = 1; i <= k-1; i ++) 73 { 74 for(j = 1; j <= n; j ++) 75 { 76 for(q = 1; q <= num-1; q ++) 77 { 78 for(u = 1; u <= num-1; u ++) 79 { 80 if(dp1[j][q]) 81 { 82 temp = lcm(fact[q],fact[u]); 83 if(j + fact[u] <= n&&temp <= m&&o[temp]) 84 { 85 dp2[j+fact[u]][o[temp]] = (dp2[j+fact[u]][o[temp]]+dp1[j][q])%MOD; 86 } 87 } 88 } 89 } 90 } 91 for(j = 1; j <= n; j ++) 92 { 93 for(q = 1; q <= num-1; q ++) 94 { 95 dp1[j][q] = dp2[j][q]; 96 dp2[j][q] = 0; 97 } 98 } 99 } 100 printf("%I64d\n",dp1[n][num-1]); 101 } 102 return 0; 103 }