• HDU 3123 GCC


    先观察一下数据范围

    0 < T <= 20
    0 <= n < 10^100 (without leading zero)
    0 < m < 1000000

     N这么大,一开始想到是大数运算,但肯定超时,所以一定有巧妙的地方。

    注意到要取余!!!! (M!)%M结果一定是0。那么(M+1)%M、(M+2)%M......结果一定全部为0.

    题目中的M大小只有1000000,所以只要算前1000000项就可以了。

    一开始的时候特判一下n和m哪个大,取小的那个算和。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    int T;
    int MOD;
    long long a[1000000+5];
    long long ans;
    char s[1000];
    int Min;
    int n;
    
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s%d",s,&MOD);
    
            a[0]=1;
            for(int i=1; i<=1000000; i++)
                a[i]=(i*a[i-1])%MOD;
    
            if(strlen(s)>=7) Min=MOD;
            else
            {
                n=0;
                for(int i=0; i<strlen(s); i++)
                    n=n*10+s[i]-'0';
                Min=min(n,MOD);
            }
            ans=0;
            for(int i=0; i<=Min; i++)
                ans=(ans+a[i])%MOD;
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    P3853 [TJOI2007]路标设置
    P1182 数列分段`Section II`
    P1948 [USACO08JAN]电话线Telephone Lines
    P1541 乌龟棋
    P1005 矩阵取数游戏
    P4001 [BJOI2006]狼抓兔子
    Windows环境中Tomcat优化
    可视化GC日志工具
    垃圾回收器
    垃圾回收机制
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4899807.html
Copyright © 2020-2023  润新知