1040 最大公约数之和 (STL)

来源:互联网 发布:没有好奇心 知乎 编辑:程序博客网 时间:2024/05/22 18:22


给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
Input
1个数N(N <= 10^9)
Output
公约数之和
Input示例
6
Output示例
15

#include<bits/stdc++.h>using namespace std;vector<int>vv;set<int,greater<int> >ss;set<int,greater<int> >::iterator it,it1 ;map<int,int>pre,a,book;long long ans;void prime_factor(int n){int i,j;for(i=2;(long long)i*i<=n;i++) {while(n%i==0) {vv.push_back(i);n=n/i;}}if(n!=1) vv.push_back(n);}void dfs(int dis,int sum){int i,j;for(i=dis;i<vv.size();i++) {if(book[i]==0) {book[i]=1;ss.insert(sum*vv[i]);dfs(i,sum*vv[i]);book[i]=0;}}}void solve(int n){int i,j,count;int m=vv.size();dfs(0,1);for(it=ss.begin();it!=ss.end();it++) {int t=*it;a[t]=n/t;}for(it=ss.begin();it!=ss.end();it++) {    it1=it;    it1++;for(;it1!=ss.end();it1++) {if((*it)%(*it1)==0) a[*it1]-=a[*it];}}ans=(long long)0;for(it=ss.begin();it!=ss.end();it++) {int t=*it;ans+=(long long)t*a[t];n-=a[t];}ans+=(long long)n;}int main(){// ios::sync_with_stdio(false); int i,j,n;cin>>n;prime_factor(n);solve(n);cout<<ans<<endl;return 0;}






0 0
原创粉丝点击