计算阶乘和Sum= 1!+2!+…+n! 对1000000007求模的结果(不含前导0)。
输入格式:
输入若干个整数 ,其中每个整数 N ,满足1<=N<=20000000。
输出格式:
输出对应各个整数的阶乘和对1000000007求模的结果,每个一行,最后一行后面一样有换行符。
输入样例:
在这里给出一组输入。例如:
因为在求阶乘的过程中会产生很大的数,会溢出,所以不能将每次阶乘的结果都存放在变量中,而是要在求阶乘的过程中就取余。
原理:
1. (a*b) mod c = (a mod c) * ( b mod c)
2. (a+b) mod c = (a mod c) +(b mod c)
// 2019/11/24 第一篇博客
#include<stdio.h>
int main(){
int N;
while(scanf("%d",&N)!=EOF)
{
long long fact=1,sum=1;
for (int i =2; i<=N; i++)
{
fact=(fact*i)%1000000007;//由原理一可知,阶乘的结果每次都保存,不用再算一遍 .由原理1 ,可以把每次相乘后都对1000000007取余
sum=(fact+sum)%1000000007;//由原理二可知 ,阶乘和的结果对1000000007取余可以每次对1000000007取余后再加入sum中
}
printf("%lld\n",sum);
}
return 0;
}
大一新生,卑微做题。
取余的方法来源与百度。