Problem Description
Apex实验室里培养了很多种类的细菌。细菌的繁殖遵循如下规则:第k种细菌在第t个单位时间内新增的数量为k^t。
例如,k=2,t=4时,第种细菌的总数为2+4+8+16。
现在,实验室里一共有n种细菌,分别为1,2,3,…,n。在第1单位时间结束后,第k种细菌的个数为k个。
求第m个单位时间结束后,所有细菌的总数。由于答案可能很大,只要输出mod (10^9+7)的值。
Input
输入包含多组测试用例。
每组数据包含两个正整数n和m,n表示细菌种类数量,m表示时间。
其中:
1 <= n,m <= 100000
Output
每组数据输出一行,表示细菌的总数mod (10^9+7)的值。
输入样例
3 3
输出样例
56
数学-线性求逆元
注意ll的使用防止乘数爆范围
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p=1e9+7;
const int N=1e5+10;
ll inv[N];
ll quick_pow(ll a,int b)
{
ll ans=1;
for(;b;b>>=1)
{
if(b&1)
ans*=a,ans%=p;
a*=a,a%=p;
}
return ans;
}
ll solve(int k,int m)
{
ll ans=(ll)k*(quick_pow(k,m)-1)%p*inv[k-1]%p;
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
inv[1]=1;
for(int i=2;i<=1e5;++i)
inv[i]=(ll)(p-p/i)*inv[p%i]%p;
while(cin>>n>>m)
{
ll res=0;
res+=m;
for(int i=2;i<=n;++i)
{
res+=solve(i,m);
res%=p;
}
cout<<res<<'\n';
}
}