Description
定义f(a)为序列a的不同的子序列个数,a是一个长度为n的序列,每个数介于1~m,求所有这种a的f(a)之和
Input
两个整数n,m(1<=n,m<=1e6)
Output
求f(a)之和,a是一个长度为n,每个数介于1~m的序列,结果模1e9+7
Sample Input
1 3
Sample Output
6
Solution
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 1111111
#define mod 1000000007ll
ll f[maxn],g[maxn];
void init(int n,int m)
{
f[0]=g[0]=1;
for(int i=1;i<=n;i++)
f[i]=1ll*m*f[i-1]%mod,g[i]=1ll*(2*m-1)*g[i-1]%mod;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
init(n,m);
ll ans=0;
for(int i=1;i<=n;i++)
ans=(ans+f[n-i+1]*g[i-1]%mod)%mod;
ans=(ans+f[n])%mod;
printf("%I64d\n",ans);
}
return 0;
}