CF822D My pretty girl Noora 题解
乍一看题目所求的式子还以为是什么神奇的推式子题,其实就是把
DP式很方便得出:
不是常规的DP方程,官方题解给了枚举因数转化为枚举倍数的优化,做到了
第一个问题,一个数拆的次数多好,还是少好?
我们简单比较两个式子即可:
第二个问题,先拆出来的素因数大好,还是小好?
同样比较两个式子(不妨设
最优化问题转化为了求一个数的最小质因数,考虑到线性筛中所有合数正用的是它最小素因数筛掉的,于是我们另开一个数组记录
总时间复杂度爆踩标算(bushi
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,l,r;
const int maxn = 5e6+5;
const ll mod = 1e9+7;
int prime[maxn],pt,sm[maxn];
void shai(){
for(int i=2;i<=maxn-5;i++){
if(!vst[i]) prime[++pt]=i;
for(int j=1;j<=pt&&i*prime[j]<=maxn-5;j++){
vst[i*prime[j]]=1;
sm[i*prime[j]]=prime[j];
if(i%prime[j]==0) break;
}
}
}
ll f[maxn],ans;
int main(){
shai();
cin>>t>>l>>r;
for(int i=2;i<=r;i++){
if(!sm[i]) sm[i]=i;
f[i]=f[i/sm[i]]+((ll)i*((ll)sm[i]-1)/2)%mod;
f[i]%=mod;
}
ll nw=1;
for(int i=l;i<=r;i++){
ans+=nw*f[i]%mod;
ans%=mod;
nw=nw*t%mod;
}
cout<<ans;
return 0;
}