• spoj 3871 gcd extreme


     1 题目大意给出一个n,求sum(gcd(i,j),0<i<j<=n);
     2 可以明显的看出来s[n]=s[n-1]+f[n];
     3 f[n]=sum(gcd(i,n),0<i<n);
     4 现在麻烦的是求f[n]
     5 gcd(x,n)的值都是n的约数,则f[n]=
     6 sum{i*g(n,i),i是n的约数},注意到gcd(x,n)=i的
     7 充要条件是gcd(x/i,n/i)=1,因此满足条件的
     8 x/i有phi(n/i)个,说明gcd(n,i)=phi(n/i).
     9 f[n]=sum{i*phi(n/i),1=<i<n}
    10 因此可以搞个for循环对i循环,只要i<n,f[n]+=i*phi(n/i);
    11 
    12 
    13 #include <iostream>
    14 #include <cstring>
    15 using namespace std;
    16 #define Max 1000000
    17 
    18 long long phi[Max+5],ans[Max+5];
    19 int prime[Max/3];
    20 bool flag[Max+5];
    21 
    22 void init()
    23 {
    24     long long  i,j,num=0;
    25     memset(flag,1,sizeof(flag));
    26     phi[1]=0;
    27     for(i=2;i<=Max;i++)//欧拉筛选
    28     {
    29         if(flag[i])
    30         {
    31             prime[num++]=i;
    32             phi[i]=i-1;
    33         }
    34         for(j=0;j<num && prime[j]*i<=Max;j++)
    35         {
    36             flag[i*prime[j]]=false;
    37             if(i%prime[j]==0)
    38             {
    39                 phi[i*prime[j]]=phi[i]*prime[j];
    40                 break;
    41             }
    42             else phi[i*prime[j]]=phi[i]*(prime[j]-1);
    43         }
    44     }
    45     //for(i=1;i<=10;i++)
    46     //    cout<<phi[i]<<endl;
    47 
    48     ans[0] =0;
    49     for(i=1;i*i<=Max;i++){
    50         ans[i*i] += i*phi[i];
    51         for(j =i+1;j*i<=Max;j++)
    52             ans[i*j] += i*phi[j]+j*phi[i];
    53     }
    54     for(int i=1;i<=Max;i++)
    55         ans[i] += ans[i-1];
    56 }
    57 
    58 int main(){
    59     init();
    60     long long n;
    61     while(cin>>n&&n){
    62 
    63         cout<<ans[n]<<endl;
    64     }
    65 }
  • 相关阅读:
    快速排序模板
    C++面试题目汇总
    二叉树两个节点的最大路径
    vim中操作的快捷键
    剑指offer 顺时针打印矩阵
    剑指offer 判断一棵树是不是另一棵树的子结构
    poi导出excel表
    java 获取服务器(ftp)指定文件夹内的文件
    部署web应用
    tomcat 的目录结构及修改端口号
  • 原文地址:https://www.cnblogs.com/Bang-cansee/p/3724023.html
Copyright © 2020-2023  润新知