感觉和求解欧拉函数的过程很像
int res=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1); //这里要先进行除法运算,再进行乘法运算,否则会溢出
}
while(n%i==0){ //根据找到的因子把能除下去的都除掉
n/=i;
}
}
if(n>1){res=res/n*(n-1);} //最后剩下的那个数也要算进去
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int g[1000010];
void change_g(int num){
for(int i=2;i*i<=num;i++){
if(num%i==0){
while(num%i==0){
g[i]++;
num/=i;
}
}
}
if(num>1){g[num]++;}
}
int main( )
{
cin>>n;
for(int i=2;i<=n;i++){
change_g(i);
}
for(int i=2;i<=n;i++){
if(g[i]){
printf("%d %d\n",i,g[i]);
}
}
return 0;
}