zoukankan      html  css  js  c++  java
  • 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
    ",tot);
    }


  • 相关阅读:
    mysql 版本查看
    js 中文乱码
    浏览器内核
    Squid 代理服务器
    minicygwin
    firefox 插件开发
    ocx c++
    NetBeans
    android 虚拟机
    ExpandableListView
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611314.html
Copyright © 2011-2022 走看看