博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cf 460 E. Congruence Equation 数学题
阅读量:6620 次
发布时间:2019-06-25

本文共 1115 字,大约阅读时间需要 3 分钟。

题意:

给出一个x 计算<=x的满足下列的条件正整数n的个数

e152216155ebecf93fd09e726ef268a11906106f.png
\(p是素数,2 ≤ p ≤ 10^{6} + 3, 1 ≤ a, b < p, 1 ≤ x ≤ 10^{12}\)

思路:

题目中存在两个循环节 \(n % p\)\(a ^ n % p\), 循环节分别为\(p,p-1\)

我们枚举\(i = n\ (mod)\ (p - 1)\)
可以得到两个方程
\[ n\ \equiv\ i\ mod\ (p-1) \]
\[ n \equiv \frac{b}{a ^ i}\ mod\ p\]

令$mm = \frac{b}{a ^ i} $

\[n = p * k + mm , n = (p - 1) * q + i \]
于是\(p * k + mm = p * q - q + i\)
在模p意义下可以得到
\(q \equiv (i - mm)\ (mod) p\)

然后就可以根据限制条件计算出有多少个满足条件的q 即答案了

#include
#define LL long longusing namespace std;LL qpow(LL x,LL y,LL mod){ x %= mod; LL ans = 1; while(y){ if(y & 1) ans = ans * x % mod; x = x * x % mod; y >>= 1; } return ans;}int main(){ LL a,b,p,X; cin>>a>>b>>p>>X; LL x,y,m = b,inva = qpow(a, p - 2,p); LL ans = 0; for(int i = 0;i < p - 1;i++){ LL mm = (i - m + p) % p; LL R = (floor)((1.0 * (X - i) / (p -1) - mm)/p) ; LL L = mm / p; // for(int j = L;j <= R;j++) cout<<(p * j + mm) * (p - 1) + i<<" "; m = m * inva % p; ans += R - L + 1; } cout<
<

转载于:https://www.cnblogs.com/jiachinzhao/p/8406784.html

你可能感兴趣的文章
Java英文单词Java基础常见英语词汇
查看>>
Faster R-CNN:详解目标检测的实现过程
查看>>
kali下更新软件时,总是报错,说下列签名无效 解决办法
查看>>
Oracle 11gR2 create init script
查看>>
手机端网页web开发要点
查看>>
silverlight水印
查看>>
微软职位内部推荐-Software Engineer II
查看>>
LeetCode-3:Longest Substring Without Repeating Characters
查看>>
MSIL条件跳转(简单注释)
查看>>
学习MSCOREE.dll是托管程序的入口点
查看>>
bbc--平台点击进入详情页配置
查看>>
ORACLE存储过程 练习系列六 关键字 分页查询某个方案下的建表语句
查看>>
JavaScript设计模式 代理模式
查看>>
Uiautomator 2.0之UiDevice新增API学习小记
查看>>
在MS Test中如何测试private方法
查看>>
.net4.0中json时间转换问题
查看>>
反射+特性打造简洁的AJAX调用
查看>>
挤牛奶
查看>>
给年轻程序员的几句话
查看>>
重新评估团队贡献分
查看>>