//poj 1150 The Last Non-zero Digit (计数) /* 题解:http://www.aowe.net/n285c6.aspx这位老兄的题解够清楚了,只是网页有毒,汗。。。 PS: 好像和之前做的求阶乘的0尾数个数的题如出一辙,只不过这题是求非0的最后一位。除了 经典的求质因数2和5的个数外,还要求以3、7、9这样的奇数结尾的数的个数。 */ #include <iostream> #include <algorithm> #include <cmath> #include <vector> using namespace std; const int inf = 1<<28; int n,m; //返回2或5的个数 int getnum(int n,int val) { int ans=0; while(n) { ans+=(n/=val); } return ans; } //返回1、3或7 的 个数 int getx(int n,int val) { int ans=0; for (int i=n;i;i>>=1) for (int j=i;j;j/=5) { ans+=j/10 + (j%10>=val); } return ans; } int num[10]; //分别代表2^i(i=2、3、7、9)的个位数循环节 int fac[4][4]={6,2,4,8, 1,3,9,7, 1,7,9,3, 1,9,1,9}; int main() { while (scanf("%d%d",&n,&m)!=EOF) { int ans=1; m=n-m; num[5]=getnum(n,5)-getnum(m,5); num[2]=getnum(n,2)-getnum(m,2); if (num[5]>num[2]) { printf("5/n"); continue; } else if (num[5]==num[2]) ans=1; else ans=fac[0][(num[2]-num[5])%4]; num[3]=getx(n,3)-getx(m,3); ans=ans*fac[1][num[3]%4]%10; num[7]=getx(n,7)-getx(m,7); ans=ans*fac[2][num[7]%4]%10; num[9]=getx(n,9)-getx(m,9); ans=ans*fac[3][num[9]%2]%10; printf("%d/n",ans); } system("pause"); return 0; }