HDU 5793 A Boring Question 2016多校第六场1001

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5793
题意:给你两个范围n,m,让你按照公式算出结果。
题解:首先你得看懂公式,才能推出公式。公式是说m个ki的有不同的取值,先对每一组取值先做乘法,再把各组的结果加起来。对于每一个ki都要和其他kj(j!=i)相乘,所以我们可以先对每一个ki的各个取值先做加法,再把每个ki做乘法。
以上的废话都在下图:

  化成这个样子,就可以用二项式定理了,一直套到最后。得出公式为(m^(n+1)-1)/(m-1)

代码如下:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll mod=1e9+7;
ll n,m;
int T;

ll qmod(ll a,ll b)
{
	ll c=1;
	while(b)
	{
		if(b&1)
			c=c*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return c;
}

int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%I64d%I64d",&n,&m);
		ll ans=(qmod(m,n+1)-1)%mod;
		ans=((ans%mod)*(qmod(m-1,mod-2)%mod))%mod;
		printf("%I64d\n",ans);
	}
	return 0;
}


posted on 2016-08-30 09:30  57老帅了  阅读(158)  评论(0编辑  收藏  举报

导航