这个题主要是要记得用long long 来存运算结果的。。。
还有就是如果N比M大的话只要算到M阶就可以了。。。
我的代码:(有点乱的)
#include<iostream>
#include<string>
using namespace std;
int main()
{
char s[105];
int num,num1;
int n,len;
int i,j,c;
int jie,jie1;
long long t,sum;
cin>>c;
while(c--)
{
cin>>s;
n=0;
sum=1;
t=1;
cin>>num;
num1=num;
while(num1)
{
num1/=10;
n++;
}
len=strlen(s);
if(len>n)
{
for(i=1;i<=num;i++)
{
t=t*(i%num)%num;
sum=(sum+t)%num;
}
cout<<sum%num<<endl;
}
else if(len==n)
{
jie1=0;
for(i=len-1;i>=0;i--)
{
jie=s[i]-'0';
for(j=i;j<len-1;j++)
jie=jie*10;
jie1+=jie;
}
if(jie1>=num)
{
for(i=1;i<=num;i++)
{
t=t*(i%num)%num;
sum=(sum+t)%num;
}
}
else
{
for(i=1;i<=jie1;i++)
{
t=t*(i%num)%num;
sum=(sum+t)%num;
}
}
cout<<sum%num<<endl;
}
else if(len<n)
{
jie1=0;
for(i=len-1;i>=0;i--)
{
jie=s[i]-'0';
for(j=i;j<len-1;j++)
jie=jie*10;
jie1+=jie;
}
for(i=1;i<=jie1;i++)
{
t=(t*(i%num))%num;
sum=(sum+t)%num;
}
cout<<sum%num<<endl;
}
}
return 0;
}
网上的代码更加简洁些:(sscanf(字符串,“提取类型”,被赋值数) 这个函数很好用的啊)
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll __int64
using namespace std;
int main()
{
//freopen("in.in","r",stdin);
int T;
char s[105];
ll n,m;
scanf("%d",&T);
while(T--)
{
scanf("%s%I64d",s,&m);
if(strlen(s)>6)
n=m-1;
else
{
sscanf(s,"%I64d",&n);
if(n>m)
n=m-1;
}
ll ans=1,cy=1,last=1;
for(ll i=1;i<=n;i++)
{
cy=(cy*i)%m;
ans=(ans+cy)%m;
if(ans==last)
break;
last=ans;
//cout<<ans<<endl;
}
printf("%I64d\n",ans%m);
//printf("haha!");
}
return 0;
}