HDU 3123

来源:互联网 发布:淘宝怎么添加银行卡 编辑:程序博客网 时间:2024/05/23 18:45

分析,本题目利用公式

(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、找一些特殊的数据测试一下 (特别大的,特别小的)

原创粉丝点击