这个题的传送地址:http://acm.hdu.edu.cn/showproblem.php?pid=5793
题意很简单,大家看过即明白。这个题是关于二项式定理和推理的应用,可能是因为数学是对规律的把握,很多人都是直接打表找规律了。
∑0≤k1,k2,⋯km≤n∏1≤j<m(kj+1kj)=∑0≤k1≤k2≤⋯≤km≤n∏1≤j<m(kj+1kj)=∑km=0n∑km−1=0km⋯∑k1=0k2∏1≤j<m(kj+1kj)=∑km=0n⎧⎩⎨(kmkm−1)∑km−1=0km⎧⎩⎨(km−1km−2)⋯∑k1=0k2(k2k1)⎫⎭⎬⎫⎭⎬=∑km=0n⎧⎩⎨∑km−1=0km⎧⎩⎨(kmkm−1)⋯∑k2=0k3(k3k2)2k2⎫⎭⎬⎫⎭⎬=∑km=0nmkm=mn+1−1m−1
这是我得到最后答案的步骤,其中第三个等号到第四个等号的转换用到的是二项式定理
2n=∑0≤k≤nCkn
第三个等号到第四个等号的转换用到二项式推论
(1+x)n=∑k=0nCknxk
最后就得到最终的答案了。后面就是快速幂取余以及求逆元了。
以上是对此题的运算过程,如有问题欢迎指教。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL mod = 1000000007;
LL pow(LL a,LL n)
{
LL ans = 1;
while(n)
{
if(n&1)
ans = ans * a % mod;
a = a * a % mod;
n>>=1;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL n,m;
scanf("%lld%lld",&n,&m);
LL ans = pow(m,n+1);
LL mod_ = pow(m-1,mod-2);
printf("%lld\n",((ans-1)*mod_%mod+mod)%mod);
}
return 0;
}