(0! + 1! + 2! + 3! + 4! + ... + n!)%m

简介:
Description
The GNU Compiler Collection (usually shortened to GCC) is a compiler system produced by the GNU Project supporting various 
programming languages. But it doesn’t contains the math operator “!”. In mathematics the symbol represents the factorial 
operation. The expression n! means "the product of the integers from 1 to n". For example, 4! (read four factorial) is
 4 × 3 × 2 × 1 = 24. (0! is defined as 1, which is a neutral element in multiplication, not 
multiplied by anything.) We want you to help us with this formation: (0! + 1! + 2! + 3! + 4! + ... + n!)%m
 
Input

The first line consists of an integer T, indicating the number of test cases. Each test on a single consists of two integer n and m.
Output

Output the answer of (0! + 1! + 2! + 3! + 4! + ... + n!)%m. Constrains 0 < T <= 20 0 <= n < 10^100 (without leading zero) 0 < m < 1000000
Sample Input
1 10 861017
Sample Output
593846
解题思路:我采用的是化简法:
0! + 1! + 2! + 3! + 4! + ... + n!
=1 + 1 * (1+2*~2+2*~3+....+2*~n)
=1 + 1 * (1+2 * (1 + 3*~3+....+3*~n))
=1 + 1 * (1+2 * (1+ 3 * (......(1 + n * (1 + 0)))))
这样化简后,可以从后往前递推记s初始为1;然后
for (int i = n; i >= 1; i--)
 { s = 1 % m + ((i %m) * (s%m))%m ; }
s %=m;
方法一:
我的代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

#define MAX_LEN 110
int main()
{
    long m;
    long n = 0;
    char ch[MAX_LEN];
    int testNum, i;

    cin >> testNum;
    for (int test = 1; test <= testNum; test++)
    {
        scanf("%s %ld", ch, &m);
        //***************确定n的值*********************************
        for (i = 0; ch[i] != '\0'; i++)
            ;
        int len = i;

        //cout << "ch =" << ch << endl;
       // cout << "len = " << len << endl;
        if (len >= 7)
        {
            n = m-1;
        }
        else
        {
            int k = 1;
            n = ch[len-1]-'0';
            for (int j = len-2; j >= 0; --j)
            {
                n += long((ch[j] - '0') * pow(10.0, double(k)));
                k ++;
                if (n >= m)
                {
                    n = m-1;
                    break;
                }
            }
        }
        //***********************************************************
        //cout << "n = " << n << endl;
        long long s = 1;
        for (i = n; i >= 1; i--)
        {
           //s = (1 + i * s) % m;
           s = 1 % m + ((i % m) * (s % m)) % m;
        }
        s %= m;
        cout << s << endl;
    }

    return 0;
}

方法二:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

#define MAX_LEN 110
int main()
{
    long m;
    long n = 0;
    char ch[MAX_LEN];
    int testNum, i;

    cin >> testNum;
    for (int test = 1; test <= testNum; test++)
    {
        scanf("%s %ld", ch, &m);
        //***************确定n的值*********************************
        for (i = 0; ch[i] != '\0'; i++)
            ;
        int len = i;

        //cout << "ch =" << ch << endl;
       // cout << "len = " << len << endl;
        if (len >= 7)
        {
            n = m-1;
        }
        else
        {
            int k = 1;
            n = ch[len-1]-'0';
            for (int j = len-2; j >= 0; --j)
            {
                n += long((ch[j] - '0') * pow(10.0, double(k)));
                k ++;
                if (n >= m)
                {
                    n = m-1;
                    break;
                }
            }
        }
        //***********************************************************
        //cout << "n = " << n << endl;
        long long s = 1;//0!=1
        long long t = 1;//0!=1
        long sum = 1;
        for (i = 1; i <= n; i++)
        {
            t = (t % m) * (i % m);
            s = t % m;
            sum = (s  + sum % m) % m;
        }
        cout << sum % m << endl;
    }

    return 0;
}

 

目录
相关文章
|
6月前
|
存储 安全 Java
发现 XSS 漏洞?别急!SpringBoot这招轻松搞定!
在SpringBoot中,发现XSS(跨站脚本)漏洞时,可以通过一系列措施来轻松搞定这些安全问题。XSS攻击允许攻击者在受害者的浏览器中注入恶意脚本,这些脚本可以窃取用户的敏感信息、劫持用户会话或进行其他恶意操作。以下是一些在SpringBoot中修复XSS漏洞的有效方法
968 7
|
10月前
|
监控 应用服务中间件 测试技术
4种典型限流实践保障应用高可用
大家好,我叫黄博文,花名延枚,目前负责云效旗下产品Flow流水线的设计和开发。在微服务架构下,服务越来越多,服务之间的调用也会越来越复杂。如何保障服务的高可用性就成为了一个挑战。之前我参与过的某个产品就曾出过故障,原因是某个API调用突然间增加了数十倍,导致服务负载过高,影响了用户使用。如果当时能够...
248 0
4种典型限流实践保障应用高可用
|
10月前
|
Prometheus 运维 监控
统一观测丨使用 Prometheus 监控云原生网关,我们该关注哪些指标?
MSE 云原生网关默认提供了丰富的 Metrics 指标大盘,配合阿里云 Prometheus 监控提供开箱即用的完整可观测性能力,能够帮助用户快捷、高效的搭建自身的微服务网关与对应的可观测体系。
380 6
|
10月前
|
SQL 监控 关系型数据库
MySQL 如何阅读死锁日志
一 前言工欲善其事必先利其器,前面分析了很多死锁案例,并没有详细的介绍如何通过死锁日志来诊断死锁的成因。本文将介绍如何读懂死锁日志,尽可能的获取信息来辅助我们解决死锁问题。二 日志分析2.1 场景为了更好的学习死锁日志,我们需要提前了解死锁场景 MySQL 5.6 事务隔离级别为RRCREATE T...
264 2
|
10月前
|
关系型数据库 MySQL 测试技术
通过performance_schema定量分析系统瓶颈
目前在系统里面, 我们可以通过perf 或者 pt-pmp 汇总堆栈的方式来查看系统存在的热点, 但是我们仅仅能够知道哪些地方是热点, 却无法定量的说这个热点到底有多热, 这个热点占整个访问请求的百分比是多少? 是10%, 还是40%, 还是80%?所以我们需要一个定量分析系统瓶颈的方法以便于我们进...
182 0
|
10月前
|
数据采集 存储 开发工具
SLS:基于OTel的移动端全链路Trace建设思考和实践
本文探讨了移动端全链路Trace的建设思考和实践。
289 0
SLS:基于OTel的移动端全链路Trace建设思考和实践
|
10月前
|
弹性计算 NoSQL Linux
安装宝塔、WebIDE
本文介绍了使用ECS云服务器搭建博客的操作及部分日常实验。
194 2
|
10月前
|
存储 关系型数据库 OLAP
基于AnalyticDB PostgreSQL数据共享实现企业级跨多业务的敏捷分析
云数据仓库AnalyticDB PostgreSQL 版发布了最新自研的云原生架构实例,实现了跨实例间的数据共享能力。允许进行跨实例间的实时数据共享且无需进行数据迁移,可支持构建安全、高效、灵活的数据分析场景。本文介绍了依托数据共享实现云数仓跨多业务实例的敏捷数据分析方案。
基于AnalyticDB PostgreSQL数据共享实现企业级跨多业务的敏捷分析
|
10月前
|
弹性计算 监控 自动驾驶
基于VPC对等连接与转发路由器组合实现多VPC互通
上周在给某自动驾驶企业落地LANDING ZONE。遇到了一个网络上面的问题。客户诉求:“客户会由多个软件供应商(ISV)提供部分功能,不同ISV人员需要登录到云控制台进行软件发布。客户希望对供应商能够做到强隔离,包括资源管理、人员身份权限及财务隔离。并且部分供应商的软件之间需要互相调用,且调用数据...
191 0
基于VPC对等连接与转发路由器组合实现多VPC互通
|
安全 算法 Java
【Java小工匠聊密码学】--消息摘要--SHA3算法
1、SHA3概述 1.1 SHA3简介 由于近年来对传统常用Hash 函数如MD4、MD5、SHA0、SHA1、RIPENMD 等的成功攻击,美国国家标准技术研究所(NIST)在2005年、2006年分别举行了2届密码Hash 研讨会;同时于2007年正式宣布在全球范围内征集新的下一代密码Hash算法,举行SHA-3竞赛·新的Hash算法将被称为SHA-3,并且作为新的安全Hash标准,增强现有的FIPS 180-2标准。
5046 0