Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
程序有,自己看,重点看分界线。#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iomanip> using namespace std; int num[20000],l; void done() { int i,j,k; l=2; num[1]=2;num[2]=3; for (i=5;i<=65535;i+=2) { k=sqrt(i); for (j=1;j<=l;j++) { if (i%num[j]==0) break; if (num[j]>k) {l++,num[l]=i;break;} } } } int kkk(int x) { int i,ans=x; int k=sqrt(x); for (i=1;i<=l;i++) { if (num[i]>k) break; if(x%num[i]==0) { ans=(ans/num[i])*(num[i]-1); while(x%num[i]==0) x/=num[i]; } if (x==1) break; } if(x>1) ans=(ans/x)*(x-1); return ans; } int main(){ // freopen (".in","r",stdin); // freopen (".out","w",stdout); done(); int ans,n; while (scanf("%d",&n)) { if (n==0) break; ans=kkk(n); printf("%d\n",ans); } fclose (stdin); fclose (stdout); return 0; } /**/ #include <cstdio> #include <cmath> using namespace std; int pri[9000],px; void prime() { int k; bool flag; pri[1]=2; px=1; for(int i=3;i<=65535;i+=2) { flag=1;k=sqrt(i); for(int j=2;j<=k;j++) if(i%j==0) {flag=0;break;} if(flag) pri[++px]=i; } } int n; int get_ans(int n) { int i=1,res=n; while(i<=px&&n>1) { if(n%pri[i]==0) { res=(res/pri[i])*(pri[i]-1); while(n%pri[i]==0) n/=pri[i]; } i++; } if(n>1) res=(res/n)*(n-1); return res; } int main() { //freopen("poj.in","r",stdin); prime(); while(scanf("%d",&n)==1&&n) { printf("%d\n",get_ans(n)); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator