822D My pretty girl Noora
比赛的时候题都没读懂还想得跟真的一样。。。
这题就是要你发现一个规律
对于一个合数m,比如m=a*b,把它拆成b组,每组a个进行两两比赛,然后晋级的b个人再两两比赛
这样所需要的比赛数不会比m个人直接两两比赛的总数多
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn=5e6+9; const int mod=1e9+7; int t,l,r; int arr[maxn]; ll ans[maxn]; int cur,tot; int main(){ scanf("%d%d%d",&t,&l,&r); arr[1]=1; for(int i=2;i<maxn;i++){ if(!arr[i]){ for(int j=i;j<maxn;j+=i){ arr[j]+=(!arr[j])*i; //最小质因数刷表 } } } ans[1]=0; for(int i=2;i<maxn;i++){ int x=arr[i]; ans[i]=(1ll*(x-1ll)*i)/2ll+ans[i/x]; } tot=0; cur=1;//t的指数次方 for(int i=l;i<=r;i++){ ans[i]%=mod; tot=(tot+1ll*cur*ans[i])%mod; cur=(1ll*cur*t)%mod; } printf("%d\n",tot); }