hdu 3123 GCC

hdu 3123 GCC

/*
一个小技巧是当n>=m时n!%m==0
所以当n>=m时直接令n==m即可
这样就不用用处理大数乘法的方式处理n!了 
*/
#define LOCAL
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<string>
#include<algorithm>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#define N 10005
using namespace std;
int main()
{
#ifdef LOCAL
       freopen("input.txt","r",stdin);
       freopen("output.txt","w",stdout);
#endif
 
     long long t=1,ans,i,ncase,m,n,nlen,mlen;string str;
     cin>>ncase;
     while(ncase--)
     {
            //数据处理 
            cin>>str>>m;
            nlen=str.size();
            t=m;mlen=0;
            while(t){t=t/10;mlen++;}
            t=1;n=0;
            for(i=nlen-1;(i>=0&&i>=nlen-8);i--)
            {
                   n+=(str[i]-'0')*t;
                   t*=10;                
            }
            if(nlen>mlen||n>m) {n=m;n--;}
            //计算 
            ans=1;t=1;
            for(i=1;i<=n;i++)
            {
                   t=(t*i)%m;//防止数据溢出 
                   ans=(ans+t)%m;            
            }
            ans%=m;//防止出现m==1出现时n%m==1的情况 
            cout<<ans<<endl;
     } 
     return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注