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 |
说下思路,贴代码这一题和1150很像,不过好像用1150的思路的话会比较复杂.考虑到数据范围没有1150的大,我就 把原来1150超时的做法改了下,果然AC了. 思路:求N!的最后非零数字.将1~N进行分解,不过只是分解成2,3,5,7,9的幂次乘以一个数, 并且用数组d[]记录它们的幂次,其中最后一个数只要记录成末尾数字就行了.比如 156=2^2*3*13,就记录成d[2]+=2,d[3]+=1,d[13%10]=d[3]+=1; #include <stdio.h> #include <memory.h> int d[10]; int pow_mod(int a,int n,int m) { if(n==0) return 1; n=(n-1)%4; int ans=1; for(int i=0;i<=n;i++) ans*=a; return ans%m; } void factor(int x,int delt) { while(x%2==0) { d[2]+=delt; x/=2; } while(x%3==0) { d[3]+=delt; x/=3; } while(x%5==0) { d[5]+=delt; x/=5; } while(x%7==0) { d[7]+=delt; x/=7; } while(x%9==0) { d[9]+=delt; x/=9; } d[x%10]+=delt; } int main() { int n,m,ans,t,i; while(scanf("%d%d",&n,&m)!=EOF) { memset(d,0,sizeof(d)); for(i=n-m+1;i<=n;i++) factor(i,1); for(i=1;i<=m;i++) factor(i,-1); t=d[2]<d[5]?d[2]:d[5]; d[2]-=t; d[5]-=t; ans=pow_mod(2,d[2],10); ans*=pow_mod(3,d[3],10); ans*=pow_mod(7,d[7],10); ans*=pow_mod(9,d[9],10); if(d[5]) ans*=5; printf("%d\n",ans%10); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator