zoukankan      html  css  js  c++  java
  • POJ2773Happy2006题解--数论好题

    题目链接

    https://cn.vjudge.net/problem/POJ-2773

    题意:

    求第(k)个与(m)互质的数

    分析

    因为(gcd(a,b)=gcd(a+t * b,b))

    所以在([1,m-1])中与(m)互质的个数与在([k imes m+1,(k+1) imes m-1])的互质(把上一个式子的(b)看成(m)一下就明白了)的个数都等于(phi (m))

    然后直接暴力计算出([1,m-1])与其互质的数,再根据周期搞一搞就好了

    还有二分+容斥的方法,先挖个坑

    代码

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cctype>
    #include <iostream>
    #define ll long long 
    #define ri register int 
    using std::min;
    using std::max;
    template <class T>inline void read(T &x){
    	x=0;int ne=0;char c;
    	while(!isdigit(c=getchar()))ne=c=='-';
    	x=c-48;
    	while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
    	x=ne?-x:x;return ;
    }
    const int maxn=1000005;
    const int inf=0x7fffffff;
    int num[maxn];
    int m,k,tot=0;
    int gcd(int a,int b){return b?gcd(b,a%b):a;}
    int main(){
    	while(scanf("%d %d",&m,&k)!=EOF){
    		tot=0;
    		for(ri i=1;i<=m;i++){if(gcd(m,i)==1)num[++tot]=i;}
    		if(!(k%tot)){printf("%lld
    ",1ll*(k/tot-1)*m+num[tot]);}//特判一下
    		else printf("%lld
    ",1ll*(k/tot)*m+num[k%tot]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    axios
    es6
    $route监听路由变化
    容易挂
    自定义全局组件/插件
    eslintrc.js
    dev-server.js
    webpack-dev-server.js
    怎么消除间隔间的空白字符
    es6语法
  • 原文地址:https://www.cnblogs.com/Rye-Catcher/p/9648304.html
Copyright © 2011-2022 走看看