#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 }
原文地址:https://www.cnblogs.com/hhxj/p/7116582.html