hdu2065"紅色病毒"問題(指數母函式+快速冪取模)
"紅色病毒"問題
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9329 Accepted Submission(s): 3816
現在有一長度為N的字串,滿足一下條件:
(1) 字串僅由A,B,C,D四個字母組成;
(2) A出現偶數次(也可以不出現);
(3) C出現偶數次(也可以不出現);
計算滿足條件的字串個數.
當N=2時,所有滿足條件的字串有如下6個:BB,BD,DB,DD,AA,CC.
由於這個資料肯能非常龐大,你只要給出最後兩位數字即可.
Output 對於每個測試例項,輸出字串個數的最後兩位,每組輸出後跟一個空行.
Sample Input 4 1 4 20 11 3 14 24 6 0
用母函式來做
A:(1 + x^2/1! + x^4/2! + ….);
B:(1 + x/1! + x^2/2! + x^3/3! + …);
C:(1 + x^2/1! + x^4/2! + ….);
D:(1 + x/1! + x^2/2! + x^3/3! + …);
可以得到
G(x) = (1 + x^2/1! + x^4/2! + ….)2 * (1 + x/1! + x^2/2! + x^3/3! + …)2;
由泰勒展開式
ex = 1 + x/1! + x^2/2! + x^3/3! + …
e-x = 1 - x/1! + x^2/2! - x^3/3! + …
得到
G(x) = e^2x + ((e^x + e^-x)/2)2;
= (1/4) * (^e2x + 1)2
= (1/4) * (e^4x + 2*e^2x + 1);
又因為:
e4x = 1 + (4x)/1! + (4x)^2/2! + (4x)^3/3! + … + (4x)^n/n!;
e2x = 1 + (2x)/1! + (2x)^2/2! + (2x)^3/3! + … + (2x)^n/n!;
所以:
n次冪的排列數為 (1/4)(4^n + 2*2^n)
化簡為(4^(n-1)+2^(n-1))%100
因為資料比較大,所以要用到快速冪取模
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long mod_exp(long long a, long long b, long long c) //快速冪取餘a^b%c 4 { 5 long long res, t; 6 res = 1 % c; 7 t = a % c; 8 while (b) 9 { 10 if (b & 1) 11 { 12 res = res * t % c; 13 } 14 t = t * t % c; 15 b >>= 1; 16 } 17 return res; 18 } 19 int main() 20 { 21 int t; 22 while(~scanf("%d",&t),t) 23 { 24 int cases=0; 25 while(t--) 26 { 27 28 cases++; 29 long long n;scanf("%lld",&n); 30 long long ans=(mod_exp(4,n-1,100)+mod_exp(2,n-1,100))%100; 31 printf("Case %d: %lld\n",cases,ans); 32 33 } 34 printf("\n"); 35 } 36 return 0; 37 }View Code
https://blog.csdn.net/weixin_39778570/article/details/82256128