• BZOJ2705 Longge的问题


    BZOJ2705 Longge的问题

    题目传送门

    题解

    表示数论题目根本不会这题一眼看过去,像是欧拉函数,结果也就是欧拉函数搞一搞,但是之前根本没学过,只能直接套个板子了。我们枚举(N)的每一个约数(X),那么这个约数对于答案的贡献就是(Euler(N/X)*X)。但是这样的复杂度是(O(N*sqrt{N})),并不满足要求,所以我们考虑只需要枚举小于等于(sqrt{N})的约数,计算这个约数的同时将(N/X)这另一个约数同时处理掉,这样复杂度就会优化到大概(O(sqrt{N}*sqrt{N})=O(N))。然而(N)(2^{32})那么大,这个玄学的复杂度竟然能够(24ms)跑过去??!实际上这个复杂度是(sum_{d|N}sqrt{d}),即(N)的所有约数的根号之和,而这个复杂度实际上也就会比(sqrt{N})大一些,并不会爆掉。具体证明的话听同学说是把约数分成(sqrt{N})前一半和后一半,然后分别证明两边复杂度不会太高,最后就能证明出总复杂度并不会到达(O(N))就行了。不过具体的还是不怎么懂。。

    code

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    bool Finish_read;
    template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
    template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
    template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('
    ');}
    template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
    /*================Header Template==============*/
    #define PAUSE printf("Press Enter key to continue..."); fgetc(stdin);
    ll n;
    /*==================Define Area================*/
    ll Euler(ll x) {
    	ll res=x;
    	for(int i=2;i*i<=x;i++) {
    		if(!(x%i)) {
    			res=res-res/i;
    			while(!(x%i)) x/=i;
    		}
    	}
    	if(x>1) res-=res/x;
    	return res;
    }
    
    int main() {
    	read(n);
    	ll res=0;
    	for(int i=1;i*i<=n;i++) {
    		if(!(n%i)) {
    			res+=1ll*Euler(n/i)*i;
    			if(i*i<n) res+=1ll*Euler(i)*(n/i);
    		}
    	}
    	printf("%lld
    ",res);
    	return 0;
    }
    
    「我不敢下苦功琢磨自己,怕终于知道自己并非珠玉;然而心中既存着一丝希冀,便又不肯甘心与瓦砾为伍。」
  • 相关阅读:
    初创业公司怎么开拓市场?(转)
    谈谈创业初期公司拓展业务的心得(转)
    互联网产品消息推送设计策略(转)
    如何成为一名合格的CTO?(转)
    jackson JsonPropertyOrder和@JsonIgnoreProperties注解
    tomcat报java.lang.VerifyError错误
    FAQ unzip无法解压文件
    Oracle监听启动失败问题
    F5 BIG-IP负载均衡器配置实例与Web管理界面体验
    如何查询 Oracle 11g日志
  • 原文地址:https://www.cnblogs.com/Apocrypha/p/9435607.html
Copyright © 2020-2023  润新知