ACM/ICPC武汉赛区水题之GCC

这个题不难,刚开始很脑残的直接O(n^2)的边乘边模,结果TLE。WOJ算是给个面子,如果不TLE肯定直接WA,因为我弱智的用int去接收高达到10^100的数据,后来看了解题报告:因为当n>=m的时候后面的n! % m = 0.所以只要处理n<m的时候就好了.一句惊醒脑残人,于是稍加更改,submit之WA一个,原来0!=1这个条件没用对地方,改之,再交,又WA一个,找到测试数据,对比发现m比较大时结果越界了,改成__int64,AC。上码字:

#include<iostream>//令m上限是9999999,7位 #include<cstring> char is[1010]; using namespace std; int main() { __int64 tmp,m,n,i,j; int cases; scanf("%d",&cases); __int64 sum,suma,k; while(cases--) { k=1; n=0; memset(is,0,sizeof(is)); sum=suma=1; scanf("%s%I64d",is,&m); if(strlen(is)>7) n=m-1; else if(strlen(is)==7 && atoi(is)>=m) n=m-1; else n=atoi(is); for(j=1;j<=n;j++) { sum=j*sum%m; suma+=sum; suma%=m; } suma%=m;//防止0,1的数据 printf("%I64d/n",suma); } return false; }

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3123

你可能感兴趣的:(ACM/ICPC武汉赛区水题之GCC)