Link

题意

给$n, m, p, x$,求有多少个$n(1\leq n \leq x)$使得$n·a^{n}=b(\textrm{mod}\;p)$成立

思路

考虑一下左边的循环节长度,由于$n%p$的循环节长度为$p$,$a^{n}%p$的循环节长度为$p-1$(根据费马小定理$a^{0}=a^{p-1}=1(\textrm{mod}\;p)$),所以(大胆猜测)左边的循环节长度就是$p*(p-1)$。接下来,设$n=k*(p-1)+i$,有原式:

$n·a^{n}=b(\textrm{mod}\;p)$

$n=b*a^{-n}(\textrm{mod}\;p)$

$k*(p-1)+i=b*a^{-k*(p-1)-i}(\textrm{mod}\;p)$

$-k+i=b*a^{-i}(\textrm{mod}\;p)$

$k=i-b*a^{-i}(\textrm{mod}\;p)$

由于$a^{i}(\textrm{mod}\;p)$的值至多$p-1$个,所以枚举$i$即可算出$k$,即可算出$n=k*(p-1)+i$此为当前$i$下$n$的最小值,然后算一下加了循环节长度之后有多少满足的$n$即可。

Code

#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl using namespace std;
typedef long long ll; const int N = 1e6 + 5; ll a, b, p, x, ans, pw[N]; ll fpow(ll a, ll b, ll mod) {
ll res = 1; a %= mod;
for(; b; b >>= 1, a = a * a % mod) if(b & 1) res = res * a % mod;
return res;
} int main() {
scanf("%lld%lld%lld%lld", &a, &b, &p, &x);
ll G = p * (p - 1);
for(int i = 1; i <= p - 1; i++) {
pw[i] = i == 1 ? a : pw[i - 1] * a % p;
ll k = ((i - b * fpow(pw[i], p - 2, p) % p) % p + p) % p;
if(x >= k * (p - 1) + i) ans += (x - k * (p - 1) - i) / G + 1;
}
printf("%lld\n", ans);
}

最新文章

  1. 输入URL到展现页面的全过程
  2. SpreadJS电子表格
  3. Java Struts2 POI创建Excel文件并实现文件下载
  4. ThinkPHP 3.2.3 Widget 扩展的使用
  5. WinAPI: ExtCreateRegion - 区域变换
  6. 集成Spring事物管理
  7. 如何在 Arch Linux 中安装 DNSCrypt 和 Unbound
  8. HTTP详解(1)-工作原理
  9. C语言标准
  10. SQL语句 递归
  11. 【风马一族_Android】Android 前端内容1
  12. 亲测 安装windows7
  13. Oracle单表的复杂查询
  14. javascript面向对象个人理解
  15. kali下安装截图软件
  16. docker容器实战-----初级&lt;2&gt;
  17. excle中表引用
  18. Mac定时关机、重启、休眠命令行
  19. vue离开页面销毁定时器
  20. 选择监听事件ItemListener(是否被选择)

热门文章

  1. linux配置本地yum源实现在局域网中在线安装软件包
  2. 一文搞定Spring Task
  3. Hexo博客搭建记录
  4. lwl-resume 个人简历编辑使用说明
  5. 请求量突增一下,系统有效QPS为何下降很多?
  6. 交叉编译esp8089
  7. 洛谷P1048 典型01背包问题
  8. MySQL 不四舍五入取整、取小数、四舍五入取整、取小数、向下、向上取整
  9. 代码小DEMO随笔---JS原生手机版本alert弹框
  10. DQL_排序查询-DQL_聚合函数