母函数的构造方法见这篇

 

一.基本思想

n为取物品的总数量(不是总数)

n很小,一般1e2~1e3左右,可以用多项式乘法,暴力求得,这是最常见的方法。链接

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

 

 

二.泰勒展开和POJ 3734 HDU2065 母函数 n很大--化公式的幂级数

 

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

小处理:

POJ 3734 HDU2065 母函数 n很大--化公式,t=f(x),直接变量代换即可

②展开式只有偶数项,用POJ 3734 HDU2065 母函数 n很大--化公式可以消去奇数项

 

三.POJ 3734

以下两题推出公式完全一样,只是模不同。图来自

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

 

#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;
}

 

相关文章:

  • 2022-03-03
  • 2021-09-24
  • 2021-11-19
  • 2021-08-29
  • 2022-12-23
  • 2022-12-23
  • 2021-12-23
猜你喜欢
  • 2021-06-04
  • 2021-11-09
  • 2022-12-23
  • 2021-11-12
  • 2021-07-14
相关资源
相似解决方案