您的位置:首页 > 其它

HDU 3123 题解,想到怎么做就不难了此题一开始没注意到long long数据的问题,最后没有除m WA了7次。幸亏最后发现了啊!这个AC来得太不容易了

2011-08-21 23:19 531 查看
需要用到一些数学公式:(a+b)%m = (a%m + b%m)%m

(a*b)%m = (a%m * b%m)%m这是利用它的余数来优化,从而减少了计算量

#include<stdio.h>
#include<string.h>

int main()
{
int i, ncases, num, m;
long long  k, sum;
char n[101];

while(scanf("%d", &ncases) != EOF)
{
while(ncases--)
{
scanf("%s%d",n,&m);
if(strlen(n) < 7)
{
num = 0;
for(i=0; i<strlen(n); i++)
{
n[i] = n[i] - '0';
num = n[i] + num*10;
}
sum = 1;
k = 1;
for(i=1; i<=num; i++)
{
k = (k*i)%m;
sum = (k + sum)%m;
}
}
else
{
sum = 1;
k = 1;
for(i=1; i<m; i++)
{
k = (k*i)%m;
sum = (k+ sum)%m;
}
}
printf("%lld\n",sum%m);  //此处一开始m没有除,导致了WA了7次。
}
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐