题意:
求组合数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;
}