写题解之前先说一下对这道题的看法:
其实想到对于一个数要是和n不互质,那么它的倍数和n也不互质。但是我真没想出来怎么实现(当时我都想写记忆化搜索……,但是那显然不是正解),看了题解一下子明白了。
一开始我们认为这n个数都是和n互质(虽然不可能),每一次判断一个数是否和这个数互质,并且如果不互质就把这个数的倍数全部删掉,并且压缩n。
普及知识:
ans * ( i - 1 ) / i :ans里面排除 i 的倍数后剩下的数。
代码如下:
#include<iostream> #include<cstring> using namespace std; long long n,ans; int main() { freopen("phi.in","r",stdin); freopen("phi.out","w",stdout); cin>>n; ans=n; int i=1; while(n!=1) { i++; if(n%i==0) { ans=ans/i*(i-1); n=n/i; } while(n%i==0) n=n/i; } cout<<ans; return 0; }
写得挺好我觉得不用改。