hdu1521 排列组合
数量固定
code:
hdu2065 "红色病毒"问题
数量无限
题目要求A、C出现偶数次,B、D出现任意次
则生成函数为:
因为我们要选n个字母,所以要找xn/(n!)的项的系数
这就要用到泰勒展开:
- e4x展开后我们需要的项的系数为4n(把上面式子的x换成4x就行了)
- 同理e2x展开后我们需要的项的系数为2n,
因为我们原式子中是2e2x,自带一个系数2,也要乘上,所以应该是2n+1 - 常数项1显然没有xn/(n!)的项,忽略
- 分母为4,再除一下,可推出答案为4n-1+2n-1
用快速幂计算就行了
code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
const int mod=100;
int ppow(int a,int b){
int ans=1;
while(b){
if(b&1){
(ans*=a)%=mod;
}
(a*=a)%=mod;
b>>=1;
}
return ans;
}
signed main(){
int T;
while(cin>>T&&T){
int cas=1;
while(T--){
int n;
cin>>n;
cout<<"Case "<<cas++<<": ";
cout<<(ppow(4,n-1)+ppow(2,n-1))%mod<<endl;
}
cout<<endl;
}
return 0;
}
poj3734
这题还是以前矩阵快速幂的练习题来着,
和hdu2065几乎一模一样, 用生成函数解的话只需要普通快速幂就行了