一.基本思想
n为取物品的总数量(不是总数)
n很小,一般1e2~1e3左右,可以用多项式乘法,暴力求得,这是最常见的方法。链接
但是n很大(比如poj 3734为1e9,hdu 2^64,差不多1e18),只能推公式,快速幂解决。
二.泰勒展开和的幂级数
小处理:
①,t=f(x),直接变量代换即可
②展开式只有偶数项,用可以消去奇数项
三.POJ 3734
以下两题推出公式完全一样,只是模不同。图来自
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p=10007;
ll n;
ll mpow(ll a, ll b)
{
ll ans=1;
while(b)
{
if(b%2==1) //b&1
{
ans=ans*a%p;
}
a=a*a%p;
b/=2; //b>>=1
}
return ans%p;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
ll cnt=(mpow(4,n-1)+mpow(2,n-1))%p;
cout<<cnt<<endl;
}
return 0;
}
四.HDU2065
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p=100;
ll n;
ll mpow(ll a, ll b)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=ans*a%p;
}
a=a*a%p;
b>>=1;
}
return ans%p;
}
int main()
{
int T;
while(cin>>T&&T!=0)
{
for(int i=1;i<=T;i++)
{
cin>>n;
ll cnt=(mpow(4,n-1)+mpow(2,n-1))%p;
printf("Case %d: %d\n",i,cnt);
}
cout<<endl;
}
return 0;
}