Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3169 | Accepted: 967 |
Description
Determine the last nonzero digit in value of expression C(n, m)
Input
The input contains a single line with n and m separated by one or several spaces; n, m are natural numbers from 1 to 1000000, n ≥ m.
Output
The output contains a single line with the last nonzero digit.
Sample Input
4 2
Sample Output
6
其它非0位问题:
bzoj 3552: 最右非零的数 && hduoj 1066: Last non-zero Digit in N!(求N!的最后一个非0位)
#include<stdio.h>
#include<string.h>
using namespace std;
int sum[8], mod2[4] = {6,2,4,8}, mod3[4] = {1,3,9,7}, mod7[4] = {1,7,9,3}; /*n个末尾为x(3,7,9)相乘得出数最后一位的规律*/
int Jud(int n, int k) /*计算出2和5的因数个数*/
{
int y;
y = 0;
while(n!=0)
{
y += n/k;
n /= k;
}
return y;
}
int all(int n, int k)
{
if(n==0)
return 0;
if(n%10>=k)
return n/10+all(n/5, k)+1;
else
return n/10+all(n/5, k);
}
int how(int n, int k) /*计算末尾为3,7,9的数的个数*/
{
if(n==0)
return 0;
return how(n/2, k)+all(n, k);
}
int main(void)
{
int n, m, ans;
while(scanf("%d%d", &n, &m)!=EOF)
{
ans = 1;
memset(sum, 0, sizeof(sum));
sum[2] = Jud(n, 2)-Jud(n-m, 2)-Jud(m, 2);
sum[5] = Jud(n, 5)-Jud(n-m, 5)-Jud(m, 5);
sum[3] = how(n, 3)-how(n-m, 3)-how(m, 3)+how(n, 9)*2-how(n-m, 9)*2-how(m, 9)*2;
sum[7] = how(n, 7)-how(n-m, 7)-how(m, 7);
if(sum[2]>sum[5]) /*如果2的数量大于5的数量,则用部分2抵消所有的5*/
ans *= mod2[(sum[2]-sum[5])%4];
else if(sum[2]<sum[5]) /*否则,末尾乘5*/
ans *= 5;
ans = ans*mod3[sum[3]%4]*mod7[sum[7]%4];
printf("%d\n", ans%10);
}
return 0;
}