这是一道和阶乘相关的数论题,还好之前和以为同学讨论一道关于阶层相关的期望题,想到了阶乘的一些性质,再者就是如何快速求出一个数的约数的个数(当时确实是忘了,还好推出来了)
下面就是题目(翻译时差点去世)
下面是ac代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long int LL ;
const int N = 1e5 + 10;
LL mod = 1e9 + 7;
LL a[N];
LL p[N];
LL ans[N];
void ole(LL n )
{
int u = n;
LL o = 1;
for(int i = 2; i <= n/i; i ++)
{
if(n % i == 0)
{
LL num = 0;
while(n % i == 0)
{
num ++ ;
n/= i;
}
o = (o * (num + 1) )%mod;
}
}
if(n > 1 && n != u)o = o * 2% mod;
p[u] = max(o -1,(LL)1);
}
LL kuai(LL A, LL B , LL C)
{
LL sum = 1%C;
for(;B;B >>= 1)
{
if(B&1)sum = sum * A % C;
A = A * A % C;
}
return sum;
}
int main()
{
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
LL sum = 1 ;
ans[1] = 0;
ans[2] = 1;
ans[3] = 6;
LL ktt = kuai((LL)2,mod-2,mod);
for(int i = 1; i <= 100000; i ++)
{
sum = sum * i % mod;
a[i] = sum;
if(i > 1)ole(i);
if(i > 3)ans[i] = (ans[i-1] * i%mod + (a[i] * ktt % mod * p[i])%mod)%mod;
}
int t;
cin >> t;
while(t--)
{
int q;
cin >> q;
cout << ans[q] << endl;
}
return 0;
}
本来是准备补一道线段树打卡的,结果发现debug太痛苦了,1个小时也没调好,战略性放弃了先QAQ