poj 1150:The Last Non-zero Digit(求A(n, m)的最后一个非0位)

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 5333 Accepted: 1628

Description

In this problem you will be given two decimal integer number N, M. You will have to find the last non-zero digit of the A(n, m) .This means no of permutations of N things taking M at a time.

Input

The input contains several lines of input. Each line of the input file contains two integers N (0 <= N<= 20000000), M (0 <= M <= N).

Output

For each line of the input you should output a single digit, which is the last non-zero digit of  NP M. For example, if  NP M is 720 then the last non-zero digit is 2. So in this case your output should be 2.

Sample Input

10 10
10 5
25 6

Sample Output

8
4
2


http://blog.csdn.net/jaihk662/article/details/77387773一模一样

只需要把程序中每个sum计算的最后一个函数调用去掉即可!

#include<stdio.h>
#include<string.h>
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);
		sum[5] = Jud(n, 5)-Jud(n-m, 5);
		sum[3] = how(n, 3)-how(n-m, 3)+how(n, 9)*2-how(n-m, 9)*2;
		sum[7] = how(n, 7)-how(n-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、付费专栏及课程。

余额充值