zoukankan      html  css  js  c++  java
  • UVA 11426 GCD

    思路:

    虽然看到题目就想到了用欧拉函数做,但就是不知道怎么做...

    当a b互质时GCD(a,b)= 1,由此我们可以推出GCD(k*a,k*b)= k。设ans[i]是1~i-1与i的GCD之和,所以最终答案是将ans[0]一直加到ans[n]。当 k*i==j 时,ans[j]=k*euler[i]。

    看完题解瞬间领悟:神奇海螺

    突然忘记欧拉函数是什么:欧拉函数

    代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cctype>
    #include<queue>
    #include<cmath>
    #include<string>
    #include<map>
    #include<stack> 
    #include<set>
    #include<vector>
    #include<iostream>
    #include<algorithm>
    #define INF 0x3f3f3f3f
    #define ll long long
    const int N=4000005;
    const int M=4000000;
    const int MOD=1000; 
    using namespace std;
    ll ans[N];
    ll euler[N];
    void get(){
    	memset(ans,0,sizeof(ans));
    	for(int i=1;i<=M;i++){
    		euler[i]=i;
    	}
    	for(int i=2;i<=M;i++){
    		if(euler[i]==i){	//i是质数 
    			for(int j=i;j<=M;j+=i){
    				euler[j]=euler[j]/i*(i-1);
    			}
    		}    //得到与i互质的个数
    		for(int k=1;k*i<=M;k++){    
    			ans[k*i]+=k*euler[i];
    		}
    	}
    	for(int i=2;i<=M;i++){
    		ans[i]+=ans[i-1];
    	}
    } 
    int main(){
    	get();
    	int T,num=1,n;
    	while(~scanf("%d",&n) && n){
    		printf("%lld
    ",ans[n]);
    	}
    	return 0;
    }


  • 相关阅读:
    心得
    第七章
    第六章
    第五章
    第四章
    第三章
    第二章
    第一章
    实验2(4)
    实验2(3)
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9409114.html
Copyright © 2011-2022 走看看