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、找一些特殊的数据测试一下 (特别大的,特别小的)
- HDU 3123
- hdu 3123
- hdu 3123
- hdu 3123
- HDU GCC(HDU 3123)解题报告
- hdu 3123 GCC
- hdu 3123 GCC
- hdu 3123 GCC
- HDU 3123 数论
- HDU 3123 GCC
- HDU 3123 GCC(数学)
- Hdu 3123 GCC
- HDU 3123 GCC
- HDU 3123 GCC
- HDU-3123-GCC
- HDU 3123 GCC
- HDU 3123 GCC
- HDU-3123 GCC(水题)
- sprintf
- NoSQL学习笔记(一)之概述
- Error loading: /opt/ibm/java2-i386-50/jre/bin/libj9thr23.so cannot restore segment prot after reloc
- ubuntu常用的安装程序的方法
- 比较器(Comparable、Comparator)类及 二叉树的排序算法!!
- HDU 3123
- JSTL格式化Date类型的日期
- 向oracle插入记录的同时获得插入的自增主键值
- fedora14中安装飞信
- asp中VBScript下 if then else的用法注意
- 进程基本概念
- 基于U盘的小型linux桌面系统1
- 判断互质,求最大公约数、最小公倍数算法
- oracle ORA-00911:无效字符