Problem H
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 111 Accepted Submission(s) : 28
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
菜鸟是个奇怪的人,他整天喜欢琢磨一些东西...
某天,他在想:如果一个数k加上n次a而且乘上m次b,然后再对p取余,之后这个数最大会变成多少呢??
因为今天菜鸟在忙于期末考试,所以现在请你来帮助解决一下这个问题 (对这个数每次你可以选择加a或者乘b, 但是你总的必须要用n次加法和m次乘法)。
某天,他在想:如果一个数k加上n次a而且乘上m次b,然后再对p取余,之后这个数最大会变成多少呢??
因为今天菜鸟在忙于期末考试,所以现在请你来帮助解决一下这个问题 (对这个数每次你可以选择加a或者乘b, 但是你总的必须要用n次加法和m次乘法)。
Input
多组测试数据,第一行有一个整数t(1<=t<=20)代表case数量,对于每个case,有六个整数k,n,m,a,b,p分别代表这个数,n次加法,m次乘法,每次加上a,每次乘上b,最后对p取余(1<=k,n,m,a,b,p<=100)。
Output
每个case形如"Case #K: M",K代表case数,从1开始,M代表对k这个数在进行上面操作后
对p取余的最大数.
Sample Input
3 100 100 100 100 100 100 1 2 3 4 5 6 54 46 78 58 99 64
Sample Output
Case #1: 0 Case #2: 5 Case #3: 62
#define DeBUG #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <string> #include <set> #include <sstream> #include <map> #include <list> #include <bitset> using namespace std ; #define zero {0} #define INF 0x3f3f3f3f #define EPS 1e-6 typedef long long LL; const double PI = acos(-1.0); //#pragma comment(linker, "/STACK:102400000,102400000") inline int sgn(double x) { return fabs(x) < EPS ? 0 : (x < 0 ? -1 : 1); } #define N 100005 bool dp[101][101][101] = zero; int cnt = 1; int main() { #ifdef DeBUGs freopen("C:\\Users\\Sky\\Desktop\\1.in", "r", stdin); #endif int T; scanf("%d", &T); while (T--) { int k, n, m, a, b, p; scanf("%d%d%d%d%d%d", &k, &n, &m, &a, &b, &p); memset(dp, 0, sizeof(dp)); bool is[101] = zero; int zn[101] = zero; int zm[101] = zero; for (int i = 0; i < 101; i++)//i加上或者乘上一个数后转移进的状态 { zn[i] = (i + a) % p; zm[i] = (i * b) % p; } dp[0][0][k] = dp[0][1][zm[k]] = dp[1][0][zn[k]] = true; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { for (int k = 0; k < p; k++) { if (dp[i - 1][j][k])//i-1个a相加出现k状态,那么k+a转移至 dp[i][j][zn[k]] = true; if (dp[i][j - 1][k])//同上 dp[i][j][zm[k]] = true; } } } for(int i=0;i<p;i++) if(dp[n][m][i]) is[i]=1; printf("Case #%d: ", cnt++ ); for (int i = p - 1; i >= 0; i--) { if (is[i]) { printf("%d\n", i); break; } } } return 0; }