hdu 3123 GCC——注意中间结果的大小__int64

来源:互联网 发布:程序员实用算法 pdf 编辑:程序博客网 时间:2024/06/05 22:40
#include<stdio.h>#include<string.h>#include<stdlib.h>char s[110];int cmp(int m){    int l=strlen(s),n;    if(l>6)        return 0;    n=atoi(s);    if(n>m)        return 0;    return 1;}int main(){    int t,n,m;    scanf("%d",&t);    while(t--)    {        scanf("%s %d",s,&m);        int h=cmp(m);        if(h==1)        {            n=atoi(s);            __int64 i,jie=1,he=1;            for(i=1;i<=n;i++)            {                jie=jie*i%m;//之前没注意到jie、he可能比int大;i-1的jie可能大于十万,i也可能大于十万,其积可能大于百亿                he=(he+jie)%m;            }            printf("%I64d\n",he%m);        }        else        {            n=m-1;            __int64 i,jie=1,he=1;            for(i=1;i<=n;i++)            {                jie=jie*i%m;                he=(he+jie)%m;            }            printf("%I64d\n",he%m);        }    }}