Dollar Dayz(大数母函数,高低位存取)
Dollar Dayz
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5655 | Accepted: 2125 |
Description
Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. During his first visit, the tools are selling variously for $1, $2, and $3. Farmer John has exactly $5 to spend. He can buy 5 tools at $1 each or 1 tool at $3 and an additional 1 tool at $2. Of course, there are other combinations for a total of 5 different ways FJ can spend all his money on tools. Here they are:
1 @ US$3 + 1 @ US$2 1 @ US$3 + 2 @ US$1 1 @ US$2 + 3 @ US$1 2 @ US$2 + 1 @ US$1 5 @ US$1Write a program than will compute the number of ways FJ can spend N dollars (1 <= N <= 1000) at The Cow Store for tools on sale with a cost of $1..$K (1 <= K <= 100).
Input
A single line with two space-separated integers: N and K.
Output
A single line with a single integer that is the number of unique ways FJ can spend his money.
Sample Input
5 3
Sample Output
5
题解:母函数的裸题;但是一交就Wa;最终看了discuss,原来是大数;又不是太大,高低位存下,然而还是Wa,因为MOD还是开小了,MOD开到10^18次方才A;协会大神真是吊,这题
我不看题解肯定想不到会是大数。。。
代码:
extern "C++"{ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; const int INF = 0x3f3f3f3f; #define mem(x,y) memset(x,y,sizeof(x)) typedef long long LL; typedef unsigned long long ULL; void SI(int &x){scanf("%d",&x);} void SI(double &x){scanf("%lf",&x);} void SI(LL &x){scanf("%lld",&x);} void SI(char *x){scanf("%s",x);} #define MOD 1000000000000000000 } const int MAXN = 10010; struct Node{ LL h,l; }; Node a[MAXN],b[MAXN]; int main(){ int n,k; while(~scanf("%d%d",&n,&k)){ mem(a,0);mem(b,0); for(int i = 0;i <= n;i++)a[i].l = 1; for(int i = 2;i <= k;i++){ for(int j = 0;j <= n;j++){ for(int t = 0;j + t <= n;t += i){ b[j + t].l += a[j].l; b[j + t].h += a[j].h; b[j + t].h += b[j + t].l / MOD; b[j + t].l %= MOD; } } for(int j = 0;j <= n;j++){ a[j].h = b[j].h; a[j].l = b[j].l; b[j].h = 0; b[j].l = 0; } } if(a[n].h) printf("%lld",a[n].h); printf("%lld\n",a[n].l); } return 0; }