当前位置: 代码迷 >> 综合 >> poj 3406 Last digit 求组合数的最后非零数
  详细解决方案

poj 3406 Last digit 求组合数的最后非零数

热度:60   发布时间:2024-01-19 05:30:18.0

题意:

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