题目描述

The factorial of a natural number is the product of all positive integers less than or equal to it. For example, the factorial of 4 is 1 · 2 · 3 · 4 = 24. A faulty factorial of length n is similar to the factorial of n, but it contains a fault: one of the integers is strictly smaller than what it should be (but still at least 1). For example, 1 · 2 · 2 · 4 = 16 is a faulty factorial of length 4. Given the length n, a prime modulus p and a target remainder r, find some faulty factorial of length n that gives the remainder r when divided by p.

Input

The first line contains three integers n, p and r (2 ≤ n ≤ 1018 , 2 ≤ p < 107 , 0 ≤ r < p) — the length of the faulty factorial, the prime modulus and the target remainder as described in the problem statement.

Output

If there is no faulty factorial satisfying the requirements output “-1 -1”. Otherwise, output two integers — the index k of the fault (2 ≤ k ≤ n) and the value v at that index (1 ≤ v < k). If there are multiple solutions, output any of them.

Sample Input 1

4 5 1

Sample Output 1

3 2

Sample Input 2

4 127 24

Sample Output 2

-1 -1

题意

题意还挺好理解的,给三个数,n,p,r(p > r),在n的阶乘中找到一个数k(2<=k <= n),将k换成比k小的数v(1<=v<k),使得换完之后的阶乘结果resp取模结果为r,即res≡r(mod p)

例如第一个样例,n = 4,阶乘为1*2*3*4,但若把3换成2,阶乘变为1*2*2*4 = 16 ≡ 1 (mod 5)

输出任意一组k,v,若找不到这样一组k,v,输出-1 -1

思路

这道题最好是讨论n,p的大小。

n>=2p时,不管修改哪一个值,得到的结果总是p的倍数,r只能为0,所以r = 0时,修改任意一个值(例如使2改为1)即可,r ≠ 0,输出-1 -1

p<=n<2p时,若r = 0,则修改的一定不是p,找到任意一个不是p的值改为1即可,找不到输出-1 -1(例如n = 2,p = 2,找不到);若r ≠ 0,则修改的一定是p,至于修改成什么,可以枚举小于p的值,找到一个即可。

n<p时,这时候用到数论的知识,根据res≡r(mod p),可以整理成v≡(mod p),p是素数,根据费马小定理,求逆元

v ≡ ((r * k % p) * Fast Power(n!, p-2, p)) % p ,枚举k,若得到的v>=1&&v<k,则找到一组,若找不到输出-1 -1

代码

#include<iostream>
#include<cstdio>
using namespace std;#define ll long longll fast_power(ll a, ll b, ll m)//快速幂
{ll ans = 1;a %= m;while(b){if(b&1) ans = ans *a % m;a = a * a % m;b >>= 1;}return ans;
}
int main()
{ll n,p,r,v;bool flag = false;scanf("%lld %lld %lld", &n, &p, &r);if(n >= 2 * p){if(r == 0)printf("2 1\n");elseprintf("-1 -1\n");}else if(n >= p && n < 2 * p){if(r == 0){for(ll i = 2; i <= n; i++){if(i != p)//只要能找到不是p的k就可{printf("%lld 1\n", i);flag = true;break;}}if(!flag)printf("-1 -1\n");}else{ll jc = 1;for(ll i = 2; i <= n; i++){if(i == p)  continue;jc = (jc * (i % p)) % p;}for(ll i = 1; i < p; i++)//将k换成i{if((jc * (i % p)) % p == r){printf("%lld %lld\n", p, i);flag = true;}}if(!flag)printf("-1 -1\n");}}else{ll jc = 1;for(ll i = 2; i <= n; i++)jc = (jc * (i % p)) % p;jc = fast_power(jc, p - 2, p);//求阶乘的逆元for(ll i = 2; i <= n; i++){v = (((r % p) * (i % p)) % p * jc) % p;//printf("%lld\n", y);if(v >= 1 && v < i){printf("%lld %lld\n", i, v);flag = true;break;}}if(!flag)printf("-1 -1\n");}//printf("%lld %lld %lld", n, p, r);return 0;
}

如有错误请指明~   ฅ●ω●ฅ

CERC2017 F-Faulty Factorial【数论】相关推荐

  1. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) F 小清新数论 欧拉函数的利用 莫比乌斯反演 杜教筛

    F - 小清新数论 做法一:欧拉函数 #include<stdio.h> #include<bits/stdc++.h> using namespace std; #defin ...

  2. 《算法竞赛中的初等数论》(二)正文 0x20同余(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  3. 2022第十四届四川省ACM(补题:B、F、H、K)

    B:https://ac.nowcoder.com/acm/contest/42105/B 这题的翻译是真的有点绕, 翻译:一个商家开发了一个看起来正常但却是黑心的网站,这个网站里面有N个网页,每个网 ...

  4. 我倒要看看你葫芦里装的是什么事药

    我倒要看看你葫芦里装的是什么B Click me 我倒要看看你葫芦里装的是什么B UVA11388 UVA11889 UVA10943 UVA10780 UVA10892 11752 UVA11076 ...

  5. Akka in JAVA(三)

    2019独角兽企业重金招聘Python工程师标准>>> Akka in JAVA(三) 上两个部分讲了Akka的基本知识和常见的用法.接下来讲一讲Akka的远程调用以及集群的使用.因 ...

  6. 【JavaScript高级程序设计】读书笔记之一 —— 理解函数

    目录 一.定义函数 二.递归函数 三.闭包 四.闭包中的this对象 五.模仿块级作用域 六.私有变量 七.即时函数与闭包的异同 参考 一.定义函数 定义函数的两种方式: (1)函数声明 functi ...

  7. python基础-装饰器

    什么是装饰器 # 概念:就是接受一个函数不改变里面的代码,进行包裹,然后返回函数的一个工具:不改变原函数调用方法的,对原函数进行包裹附加功能的工具 # 原理:利用高阶函数可以接受函数作为参数,返回函数 ...

  8. 第十二届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组

    试题A :取余 1 试题 B: 双阶乘 // 59375 #include <iostream> using namespace std;const int mod = 100000;in ...

  9. 二叉树期权定价python代码_欧式和美式期权的二叉树和Greek(1)——PYTHON

    欧式和美式期权(Option)是最基础的衍生证卷.如何定价是初学金融工程者的必备知识.二叉树的又是最简单但是容易理解的工具.在网上有期权计算器可以很容易得到.但是练习自己编写还是有收益的. 欧式期权的 ...

  10. Java基础篇:什么是递归?如何用递归?

    Java支持递归.递归就是依照自身定义事物的过程.在Java编程中,递归是允许方法调用自身调用的属性.调用自身的方法称为是递归的. 递归的典型例子是数字的阶乘.数字N的阶乘是1到N之间所有整数的乘积. ...

最新文章

  1. Spring Boot配置文件学习记录【1】
  2. 阶段-关口系统---Stage0发现阶段
  3. Android Bundle--ArrayMap详解
  4. APP运营如何找到精准用户,提升品牌知名度
  5. Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?
  6. jenkins执行bat失败_关于批处理文件:即使在BAT脚本中成功执行了ROBOCOPY命令,JENKINS作业也会失败...
  7. 如何编写python爬虫_如何完整写一个爬虫框架
  8. 赋能未来的昆腾全新Scalar存储平台
  9. 最新Apple苹果开发者账号AppleID注册流程
  10. QR码生成原理(一)
  11. cos(a+b)=cosa*cosb-sina*sinb的推导过程
  12. 苹果手机量体温_手机记录西藏之旅和美食
  13. 关于常用的Lambda(拉姆达)表达式
  14. 旁瓣对消原理_自适应旁瓣相消的原理
  15. dayjs,当年月周日
  16. knife4j的使用
  17. 计算机专业的实验器材,【计算机专业论文】系统观下的计算机专业实验平台建设(共3640字)...
  18. 破窗理论和童子军军规
  19. Twitter实时搜索系统EarlyBird
  20. unity 手写板功能 HandwritingBoard

热门文章

  1. steam邮箱登录教程
  2. 页面浏览量和点击量_如何计算页面浏览量
  3. APS生产计划排产在装备制造业的应用
  4. linux中etc目录的作用,/etc 目录的作用到底是干什么用的?
  5. 矩阵和向量的范式(Norms for Vectors and Matrices)
  6. 浅谈css样式及选择器
  7. dellt130服务器做系统,戴尔Dell R330;T130安装系统后键盘鼠标不能使用
  8. mysql学习笔记 51_mysql学习笔记
  9. python中reduce是什么意思_Python----reduce原来是这样用的
  10. 2021金九银十面试季!java开发微信公众号图片上传功能