(hdu step 2.2.8)N!Again(求N!的阶乘%2009以后的结果)
来源:互联网 发布:surface适合编程吗 编辑:程序博客网 时间:2024/06/05 02:11
题目:
N!Again
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 941 Accepted Submission(s): 526Problem Description
WhereIsHeroFrom: Zty, what are you doing ?
Zty: I want to calculate N!......
WhereIsHeroFrom: So easy! How big N is ?
Zty: 1 <=N <=1000000000000000000000000000000000000000000000…
WhereIsHeroFrom: Oh! You must be crazy! Are you Fa Shao?
Zty: No. I haven's finished my saying. I just said I want to calculate N! mod 2009
Hint : 0! = 1, N! = N*(N-1)!
Zty: I want to calculate N!......
WhereIsHeroFrom: So easy! How big N is ?
Zty: 1 <=N <=1000000000000000000000000000000000000000000000…
WhereIsHeroFrom: Oh! You must be crazy! Are you Fa Shao?
Zty: No. I haven's finished my saying. I just said I want to calculate N! mod 2009
Hint : 0! = 1, N! = N*(N-1)!
Input
Each line will contain one integer N(0 <= N<=10^9). Process to end of file.
Output
For each case, output N! mod 2009
Sample Input
4 5
Sample Output
24120
Author
WhereIsHeroFrom
Source
HDU女生专场公开赛——谁说女子不如男
Recommend
lcy
题目分析:
这道题,扫了一眼题目以后,再扫一遍数据规模,就知道直接暴力肯定是会超时的,因为n大的有点吓人啊。这种题,个人觉得可能还是得找规律。规律主要从以下两个方面找:
1)可能存在循环节。如果存在循环节,吧循环节找到(假设是m),那么输入n的时候,输出fac(n%m)即可。
2)可能某一项(假设是m)以后%2009以后的结果全是一个数k。那么就只需要计算前m项即可,当n>m时,直接输出相应结果就行。
为了确定是以上两种情况的哪一种,我写了一下的java打表程序(因为n为41是,阶乘的结果就是33452526613163807108170062053440751665152000000000了,这已经超出了证书的范围,所以需要用到java中的大数)。直达前100项,个人觉得前100项一般都能说明问题了。
在这里需要注意一点的是:
1*2*3.。。*i%2009所得到的结果与1%2009*2%2009......i%2009所得到的结果是完全一样的。fac(41)阶乘已经超过long 的范围了,所以这里去一下巧,每一项都%2009,用来避免超过long 的范围
打表程序
import java.math.BigInteger;import java.util.Scanner;public class Test {public static BigInteger fac(int n){BigInteger sum = new BigInteger("1");int i;for(i = 1 ; i <= n; ++i){sum = sum.multiply(BigInteger.valueOf(i));}return sum.mod(BigInteger.valueOf(2009));//return sum;}public static void main(String[] args) {//Scanner scanner = new Scanner(System.in);////while(scanner.hasNext()){//int n = scanner.nextInt();//System.out.println(fac(n));//}int i;for(i = 1 ; i <= 100 ; i++){System.out.println(i + ": " + fac(i));}}}
通过打表,确定了猜想2是符合这道题的规律。第41项以后的阶乘出来的数%2009的结果都是0。既然规律都找到了,
那么接下来就是编写代码了:
/* * f.cpp * * Created on: 2015年2月2日 * Author: Administrator */#include <iostream>#include <cstdio>using namespace std;long long fac(long long n){int i;long long sum = 1;for(i = 1 ; i <= n ; ++i){sum *= i;sum %= 2009;}return sum;}int main(){int n;while(scanf("%d",&n)!=EOF){if(n < 41){printf("%lld\n",fac(n));}else{printf("0\n");}}return 0;}
1 0
- (hdu step 2.2.8)N!Again(求N!的阶乘%2009以后的结果)
- hdu--2674 求N!%2009的结果
- 阶乘N!求结果的位数 n<10000
- 求n的阶乘
- 求n的阶乘
- 求n的阶乘
- 求n的阶乘
- 求N的阶乘
- 求n的阶乘
- 求n的阶乘
- 求n的阶乘
- 求n的阶乘
- 求N的阶乘
- 求N的阶乘
- 求N的阶乘
- 求N的阶乘
- 求n的阶乘,使用数组存储结果
- 【大数据】求n的阶乘N!
- 链表排序
- const int * pi 、int const * pi与int * const pi及其操作
- 黑马程序员------C语言-----初识C语言
- Object-c 数组总结
- poj3299 Humidex
- (hdu step 2.2.8)N!Again(求N!的阶乘%2009以后的结果)
- OpenFire源码学习之五:用户登录
- BZOJ 3011 Usaco2012 Dec Running Away From the Barn 可并堆
- Java语言程序设计-基础篇-5.6习题-显示模式
- 小马哥----珍米ZMi_S801 仿米4 刷机开机界面图与外观图,国产机6582芯片
- 【VB.NET】全局观概括
- 【POJ-1005】I Think I Need a Houseboat
- Managing time
- NSTimer的启动与停止、暂停和继续