poj 3406 Last digit 求組合數的最後非零數
阿新 • • 發佈:2019-02-02
題意:
求組合數C(n,m),n>=m的最後非0數。
分析:
與求排列數的最後非0數類似,要注意分母上以3結尾的數可能比分子上的多,要特殊處理。
程式碼:
//poj 3406 //sep9 #include <iostream> using namespace std; int table[4][4]={ 6,2,4,8, 1,3,9,7, 1,7,9,3, 1,9,1,9, }; int f2(int n) { if(n==0) return 0; return n/2+f2(n/2); } int f5(int n) { if(n==0) return 0; return n/5+f5(n/5); } int g(int n,int x) { if(n==0) return 0; return n/10+(n%10>=x)+g(n/5,x); } int f(int n,int x) { if(n==0) return 0; return f(n/2,x)+g(n,x); } int main() { int n,m,num2,num3,num5,num7,num9; while(scanf("%d%d",&n,&m)==2){ num2=f2(n)-f2(n-m)-f2(m); num5=f5(n)-f5(n-m)-f5(m); num3=f(n,3)-f(n-m,3)-f(m,3); num7=f(n,7)-f(n-m,7)-f(m,7); num9=f(n,9)-f(n-m,9)-f(m,9); num3+=num9*2,num9=0; int res=1; if(num2<num5){ printf("5\n"); continue; } if(num2!=num5){ res*=table[0][(num2-num5)%4]; res%=10; } res*=table[1][num3%4]; res%=10; res*=table[2][num7%4]; res%=10; res*=table[3][num9%4]; res%=10; printf("%d\n",res); } return 0; }