POJ 3734 HDU2065 母函數 n很大--化公式

母函數的構造方法見這篇

 

一.基本思想

n爲取物品的總數量(不是總數)

n很小,一般1e2~1e3左右,可以用多項式乘法,暴力求得,這是最常見的方法。鏈接

但是n很大(比如poj 3734爲1e9,hdu  2^64,差不多1e18),只能推公式,快速冪解決。

 

 

二.泰勒展開和\large e^{x}的冪級數

 

小處理:

\large e^{t},t=f(x),直接變量代換即可

②展開式只有偶數項,用\large e^{x}+e^{-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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章