poj 3406:Last digit(求C(n, m)的最后一个非0位)

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; nm 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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值