tyvjP1346 MMT数
Posted 沐灵_hh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tyvjP1346 MMT数相关的知识,希望对你有一定的参考价值。
tyvjP1346 MMT数
描述
FF博士最近在研究MMT数(莫明堂数-_-)。
如果对于一个数n,存在gcd(n,x)<>1并且n mod x<>0 那么x叫做n的MMT数
显然这样的数可以有无限个。
FF博士现在想知道在所有小于n的正整数里面有多少个n的MMT数
如果对于一个数n,存在gcd(n,x)<>1并且n mod x<>0 那么x叫做n的MMT数
显然这样的数可以有无限个。
FF博士现在想知道在所有小于n的正整数里面有多少个n的MMT数
输入格式
仅一行一个数,为n
输出格式
所有小于n的正整数里面有多少个n的MMT数
测试样例1
输入
10
输出
3
备注
样例解释: 3个数分别是 4 6 8
gcd(n,x)的意思是求n和x的最大公约数
对于50%的数据 n<=1000000
对于100%的数据n<=maxlongint
gcd(n,x)的意思是求n和x的最大公约数
对于50%的数据 n<=1000000
对于100%的数据n<=maxlongint
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch=‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int n,phi,tot,ans,num[500010],sum=1; int gcd(int a,int b){ if(!b) return a; return gcd(b,a%b); } int main(){ phi=n=read(); int tmp=n; for(int i=2;i*1ll*i<=tmp;++i){ if(tmp%i==0){ ++tot; phi=phi/i*(i-1); while(tmp%i==0){ ++num[tot]; tmp/=i;} } if(tmp==1) break; } if(tmp>1){phi=phi/tmp*(tmp-1); num[++tot]=1;} for(int i=1;i<=tot;++i) sum=sum*(num[i]+1); printf("%d\n",n-phi-sum+1); return 0; }
以上是关于tyvjP1346 MMT数的主要内容,如果未能解决你的问题,请参考以下文章