Square Coins
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7452 Accepted Submission(s): 5050
There are four combinations of coins to pay ten credits:
ten 1-credit coins,
one 4-credit coin and six 1-credit coins,
two 4-credit coins and two 1-credit coins, and
one 9-credit coin and one 1-credit coin.
Your mission is to count the number of ways to pay a given amount using coins of Silverland.
2 10 30 0
1 4 27
解题思路:
本题的母函数为 (1+x+x^2+x^3+x^4........) * (1+x^4+x^8+x^12+x^16....) *(1+x^9+x^18+x^27....) * ..............................*(1+x^289+x^(289*2)+..............
1分的硬币有多少个 4分的硬币有多少个 9分的硬币有多少个
这个多了一些限制条件,在母函数模板里改几个地方就可以了。重在理解。
代码:
#includeusing namespace std; int c[302],temp[302],n; int main() { while(cin>>n&&n) { for(int i=0;i<=n;i++) { c[i]=1; temp[i]=0; } for(int i=2;i*i<=n;i++)//i是代表多少个式子相乘,这里i*i<=n的意思是比如要求 x^16次方,第一个式子是以1打头的(1+x+x^2+x^3...),1*x^16,所有的式子中最后一次出现x^16次方的是(1+x^16+x^32..)这是第4个式子。 { for(int j=0;j<=n;j++) for(int k=0;k+j<=n;k+=i*i)//注意 k+=i*i ,因为比如当i等于2时,代表第2个式子1+x^4+x^8+x^12+x^16..,注意指数。 temp[j+k]+=c[j]; for(int i=0;i<=n;i++) { c[i]=temp[i]; temp[i]=0; } } cout<