#422(div2)D. My pretty girl Noora
题意:N个人比赛,将N个人平均分为N/X组,每组对f[N]的贡献是x*(x-1)/2;N/X个晋级,然后继续操作,贡献为f[N/X].t^0*f[l]+t^1*f[l+1]......+t^(r-l)*f[r]最小
思路:我们改变X使其f[i]发生改变,当i为质数只能为1组,即贡献为i*(i-1)/2。那么合数的贡献最小为什么,易发现当每组为他的最小质因子时,最优,记得开long long ,还有看见t^0,t^1,下意识就用了快速幂,T到死,还百度快速求素数,然而我SB了
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod=1e9+7; 5 const int N=5*1e6+10; 6 7 ll a[N]; 8 ll b[N]; 9 10 11 int main(){ 12 ll t,l,r; 13 cin>>t>>l>>r; 14 for(ll i=2;i<=r+1;i++){ 15 if(b[i]) {continue;} 16 for(ll j=i*i;j<=r+1;j+=i){ 17 if(b[j]==0) 18 b[j]=i; 19 } 20 } 21 a[2]=1;a[3]=3; 22 for(ll i=4;i<=r;i++){ 23 if(b[i]){ 24 ll x=b[i]; 25 a[i]=(a[x]*(i/x)+a[i/x]+mod)%mod; 26 } 27 else a[i]=(i*(i-1)/2+mod)%mod; 28 } 29 ll xx=1; 30 ll sum=0; 31 for(ll i=l;i<=r;i++){ 32 sum=(sum+xx*a[i]+mod)%mod; 33 xx=(xx*t+mod)%mod; 34 } 35 cout<<sum<<endl; 36 }