HDU 3123

分析,本题目利用公式

(a * b) % m = [( a%m ) * ( b%m )] % m ,计算阶乘模m的值

(a + b) % m = [(a % m) + (b % m)] % m ,计算所有阶乘的余数树的和mod m 的值
由于,n > m时,只用计算到 (m-1)! ,n < m , n 的值在六位以内;故总体用整形数据类型就行,不存在大数加法乘法,非常容易

注意计算过程中 (a % m) * (b % m) 可能会超出整形的范围,用64位整形!
总体看来,我对这方面的题很不熟练啊,字符串和数之间的转换总会出问题……再者,就是看到题后没好好分析题目,不懂得题中奥妙啊~~

 

#include<stdio.h>
#include<string.h>
int main()
{
	__int64 yushu,result;
	int max,m,i,len,cas;
	char n[101];
	scanf("%d",&cas);
	getchar();
	while(cas--)
	{
		scanf( "%s%d", n, &m);
		len = strlen(n);
		if(len >= 7)         //对应 n > m 的情况,只用计算到 (m - 1)!
			max = m;
		else
		{
			max = 0;
			for( i = 0;i < len ; i++)
			{
				max = max * 10 + n[i] - '0';    //计算 n 的值(此时 n 最多是个六位数字)
				if( max > m)     //如果 n > m ,取 max = m
				{
					max = m;
					break;
				}
			}
		}
		yushu = 1;
		result = 1;
		for(i = 1 ;i <= max ; i++)      // attention !!  max==0 的情况考虑一下,此时没有进去循环
		{
			yushu = (yushu * i) % m;
			result = (result + yushu) % m;
		}
		printf("%I64d\n",result%m);   //把这里改了就对了,可是为啥啊?? 唉,防止 n=0 时没有进行取模运算
	}
	return 0;
}
//呜呜——感觉自己好挫!!!  当 n = 0 时,没有进行模运算,result==1 ,看着好像没错,可是看这组数据 n = 0, m = 1 还能输出 1 ?!
//两点:1、算法感觉没错时,看看是不是自己的数据类型、空间能弄错了;2、找一些特殊的数据测试一下 (特别大的,特别小的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值