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';
    }
}
 posted on 2023-05-14 22:46  ruoye123456  阅读(80)  评论(0)    收藏  举报