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$1
Write 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 = ;
struct Node{
LL h,l;
};
Node a[MAXN],b[MAXN];
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
mem(a,);mem(b,);
for(int i = ;i <= n;i++)a[i].l = ;
for(int i = ;i <= k;i++){
for(int j = ;j <= n;j++){
for(int t = ;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 = ;j <= n;j++){
a[j].h = b[j].h;
a[j].l = b[j].l;
b[j].h = ;
b[j].l = ;
}
}
if(a[n].h)
printf("%lld",a[n].h);
printf("%lld\n",a[n].l);
}
return ;
}