HDU 3123 大数阶乘取模

简介:

题意:Output the answer of (0! + 1! + 2! + 3! + 4! + ... + n!)%m.

这题想难了,暴力就行的东西我竟然素因子分解那么做了,这么做素数的时候比暴力慢,不是素数的时候我也不知道快不快。。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1100
bool isprime[maxn];
int prime[maxn],nprime;
void getprime()
{
    memset(isprime,1,sizeof(isprime));
    long long i,j;
    nprime=0;
    for(i=2; i<maxn; i++)
        if(isprime[i])
        {
            prime[nprime++]=i;
            for(j=i*i; j<maxn; j+=i)
                isprime[j]=0;
        }
}
int factor[35],tol;
void findfac(int m)
{
    int d=m;
    tol=0;
    for(int i=0; prime[i]*prime[i]<=m; i++)
        while(d%prime[i]==0) factor[tol++]=prime[i],d/=prime[i];
    if(d>1) factor[tol++]=d;
}
char c[105];
int n,m;
int getn()
{
    int len=strlen(c),ans=0;
    for(int i=0; i<len; i++)
    {
        ans=ans*10+c[i]-'0';
        if(ans>=m)
            return m-1;
    }
    return ans;
}
int main()
{
    int t;
    long long yl;
    getprime();
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%d",c,&m);
        yl=getn();
        findfac(m);
        int d1=yl;
        for(int i=2; i<=yl; i++)
        {
            int d2=i;
            for(int j=0; j<tol; j++)
                if(d2%factor[j]==0&&factor[j]!=1)
                    d2/=factor[j],d1/=factor[j],factor[j]=1;
            if(d1==1)
            {
                yl=i;
                break;
            }
        }
        long long ans=1,jc=1;
        for(long long i=1; i<=yl; i++)
            jc=(jc*i)%m,ans=(ans+jc)%m;
        ans=(ans%m+m)%m;
        printf("%I64d\n",ans);
    }
    return 0;
}


目录
相关文章
|
6月前
|
容器
华为机试HJ60:查找组成一个偶数最接近的两个素数
华为机试HJ60:查找组成一个偶数最接近的两个素数
|
6月前
|
人工智能 算法 测试技术
华为机试HJ52:计算字符串的距离(动态规划)
华为机试HJ52:计算字符串的距离(动态规划)
|
算法
LeetCode每日一题——668. 乘法表中第k小的数
几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第k小的数字吗?
90 0
|
Java Python
每日一题 | LeetCode 454 四数相加Ⅱ
每日一题 | LeetCode 454 四数相加Ⅱ
93 0
|
算法 UED
[解题报告]《算法零基础100讲》(第49讲) 位运算 (右移)
[解题报告]《算法零基础100讲》(第49讲) 位运算 (右移)
[解题报告]《算法零基础100讲》(第49讲) 位运算 (右移)
|
算法 Java 编译器
解题报告]《算法零基础100讲》(第48讲) 位运算 (左移)
解题报告]《算法零基础100讲》(第48讲) 位运算 (左移)
|
Java BI 机器学习/深度学习
|
Java 人工智能
HDU 2561 第二小整数
第二小整数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10766    Accepted Submission(s): 6548 Problem Description 求n个整数中倒数第二小的数。
923 0
|
Java
HDU 2092 整数解
整数解 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33425    Accepted Submission(s): 11730 Problem Description 有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。
865 0
模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace
Cyclic Nacklace  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=3746   Mean:  给你一个字符串,让你在后面加尽量少的字符,使得这个字符串成为一个重复串。
1197 0