zoukankan      html  css  js  c++  java
  • GCD

    训练指南p125

    数论学到现在觉得最有意思的一道题

    gcd(a,b)==c等价于gcd(a/c,b/c)==1

    这样就可以用欧拉函数求出满足给定a,gcd(a,b)==c的b的个数

    还有一个要点是算贡献取代枚举因子,这个思想最近多校运用的挺多的。。

    //#pragma comment(linker, "/STACK:1024000000,1024000000") 
    #include<bits/stdc++.h>
    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    #include<set>
    #include<map>
    #include<vector>
    #include<iomanip>
    using namespace std;
    #define ll long long
    #define pb push_back
    #define FOR(a) for(int i=1;i<=a;i++)
    const double PI = acos(-1.0);
    
    const int maxn=4e6+6;
    ll S[maxn];
    ll f[maxn];
    
    int phi[maxn];
    void phi_table(){
    	phi[1]=1;
    	for(int i=2;i<maxn;i++){
    		if(!phi[i])
    			for(int j=i;j<maxn;j+=i){
    				if(!phi[j])phi[j]=j;
    				phi[j]=phi[j]/i*(i-1);
    			}
    	}
    }
    
    void init(){
    	phi_table();
    	for(int i=1;i<maxn;i++){
    		for(int j=i*2;j<maxn;j+=i)f[j]+=i*phi[j/i];
    	}
    }
    
    int main(){
    	int n;
    	init();
    	for(int i=1;i<maxn;i++){
    		S[i]=S[i-1]+f[i];
    	}
    	while(scanf("%d",&n) && n){
    		printf("%lld
    ",S[n]);
    	}
    }


  • 相关阅读:
    四则运算————javaweb版
    构建之法阅读笔记02
    十一周学习进度条
    软工概论-课堂练习:添加信息
    梦断代码阅读笔记01
    链接doc命令行的mysql的编码问题
    构建之法阅读笔记01
    第十周学习进度条
    web
    sql初——基础
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611298.html
Copyright © 2011-2022 走看看