阶乘取模

Description

计算 
(0! + 1! + 2! + 3! + 4! + ... + n!)%m

Input

第一行输入t,表示测试数据组数
每组数据输入两个数n和m

0 < T <= 20
0 <= n < 10^100 (没有前导零)
0 < m < 1000000

Output

输出(0! + 1! + 2! + 3! + 4! + ... + n!)%m的答案

Sample Input

1
10 861017

Sample Output

593846
 
这道题注意的是每次运算都要取模,不然会很大,会数据溢出。
参考代码:
 

#include<stdio.h>

#include<algorithm>

#include<string.h>

using namespace std;

int main()

{

__int64 i,s,t,m,n,temp;

char c[110];

scanf("%I64d",&t);

while(t--)

{

n=0;

temp=s=1;

scanf("%s",c);

scanf("%I64d",&m);

if(strlen(c)>7)

n=m;

else

for(i=0;i<strlen(c);i++)

n=10*n+c[i]-'0';

if(n>m)

n=m;

for(i=1;i<=n;i++)

{

temp*=i;

temp%=m;

s+=temp;

s%=m;

}

printf("%I64d\n",s%m);

}

return 0;

}

更多做题心得的详情请查看(记得关注哦)https://mp.weixin.qq.com/s?__biz=MzIyOTM4MDMxNw==&mid=2247483798&idx=1&sn=d4fbd34e50ce4efda39d7710d2dc5dc9&chksm=e842d824df3551320d7f1ed85286b2616aec419f7a852cc5c9c9f270beb237b5e6ca83166162&token=1630951018&lang=zh_CN#rd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值