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