传送门:HDU5793
题意:就是求题目中的公式。
思路:将题目式子稍微化简一下,然后打表找了个规律:
要求f[n]
f[1] = m + 1;
f[i] = f[i - 1] * m + 1;
可以求得通项公式:f[n] = (a1 + 1 / (m - 1)) * m^(n - 1) + 1 / (1 - m)
然后快速幂 + 费马小定理搞搞就行了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int> P;
const int MAXN = 100010;
//ll fac[22], n, m, ans = 0;
//int num[MAXN];
//void dfs(int dep, int s)
//{
// if(dep == m)
// {
// ll sum = fac[num[m - 1]];
// for(int i = m - 1; i >= 1; i--)
// sum /= fac[num[i] - num[i - 1]];
// sum /= fac[num[0]];
// ans += sum;
// return ;
// }
// for(int i = s; i <= n; i++)
// {
// num[dep] = i;
// dfs(dep + 1, i);
// }
//}
//int main()
//{
// fac[0] = 1;
// for(int i = 1; i <= 20; i++)
// fac[i] = fac[i - 1] * i;
// for(int i = 0; i <= 10; i++)
// for(int j = 1; j <= 10; j++)
// {
// n = i, m = j;
// ans = 0;
// dfs(0, 0);
// cout << i << " " << j << " " << ans << endl;
// }
// return 0;
//}
const int mod = 1e9 + 7;
ll qmul(ll a, ll b)
{
ll ans = 1;
while(b)
{
if(b & 1) ans = ans * a % mod;
b >>= 1;
a = a * a % mod;
}
return ans;
}
int main()
{
int T;
ll n, m;
cin >> T;
while(T--)
{
scanf("%lld %lld", &n, &m);
if(m == 1)
{
cout << n + 1 << endl;
continue;
}
if(n == 0)
{
cout << 1 << endl;
continue;
}
ll tmp = qmul(m, n - 1);
ll ans = (tmp * m % mod) * m - 1;
cout << (ans % mod * qmul(m - 1, mod - 2)) % mod << endl;
}
return 0;
}