退役后刷的第一道题…
题解:
n!内某个因子a的指数:
每次轮流除以a, 当前商+剩余贡献即可
例:
9! : 9 / 3 = 3; 3 / 3 = 1
ans = 4对于[ka, ka + a - 1],
阶乘中因子a的指数相同
定义
cal(i,n)是i!中因子n的指数
ans=∑i=1nmcal(i,n)=cal(nm,n)+∑i=1nm−1cal(i,n)=∑i=0m−1ni+n∗∑i=1nm−1−1cal(i∗n,n)=nm−1n−1+n∗(∑i=1nm−1−1i+∑i=1nm−1−1cal(i,n))=....=nm−1n−1+nm∗(∑i=0m−1(ni−1))∗inv2
快速幂逆元搞一下(中间推导略了一部分)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const ll _2 = (mod + 1) >> 1;
ll qpow(ll a, ll b, ll c)
{
ll res = 1 % c;
while(b)
{
if(b & 1) res = res * a % c;
a = a * a % c;
b >>= 1;
}
return res;
}
int main()
{
ll n, m;
scanf("%lld%lld", &n, &m);
ll x = (qpow(n, m, mod) + mod - 1) % mod * qpow(n - 1, mod - 2, mod) % mod;
ll res = x + qpow(n, m, mod) * ((x - m) % mod + mod) % mod * _2 % mod;
res = ((res + mod) % mod + mod) % mod;
printf("%lld\n", res);
return 0;
}