一.基本思想
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;
}