博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #460 (Div. 2): E. Congruence Equation(枚举)
阅读量:2143 次
发布时间:2019-04-30

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

给出a, b, p, x,求有多少个n满足①n*a^n%p==b;②n<=x

思路:先要知道一个很简单的性质:a^n%p的值一定存在循环节(n=0就进入循环),且周期T一定是p-1的约数

然后就好做了,①暴力枚举a^i%p(i从0到p-1)算出每个余数ki,可以得到式子c*ki%p==b

②对于每个ki,用逆元求出c,c = b*(ki对p的逆元)

③如果存在一个n满足n*a^n%p==b,那么很显然n%(p-1)==i 并且n%p==c,最小的n可以用求出

④然后就是一个简单的除法了,对于所有<=x的n的倍数都满足条件

复杂度O(plogp)

#include
#define LL long longLL k[1005555];LL Pow(LL a, LL b, LL p){ LL ans = 1; while(b) { if(b%2) ans = ans*a%p; a = a*a%p; b /= 2; } return ans;}int main(void){ LL a, b, p, x, i, xh, last, c, n, ans; scanf("%lld%lld%lld%lld", &a, &b, &p, &x); ans = 0, xh = p-1; for(i=0;i<=p-2;i++) { k[i] = Pow(a, i, p); c = Pow(k[i], p-2, p)*b%p; n = ((p-1)*(p-1)*c+p*i)%(p*(p-1)); ans += (x-n+p*(p-1))/(p*(p-1)); } printf("%lld\n", ans); return 0;}

你可能感兴趣的文章
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>
开源Faac实现PCM编码AAC
查看>>
Windows下wave API 音频采集
查看>>
借船过河:一个据说能看穿你的人性和欲望的心理测试
查看>>
AndroidStudio 导入三方库使用
查看>>
Ubuntu解决gcc编译报错/usr/bin/ld: cannot find -lstdc++
查看>>
解决Ubuntu14.04 - 16.10版本 cheese摄像头灯亮却黑屏问题
查看>>
解决Ubuntu 64bit下使用交叉编译链提示error while loading shared libraries: libz.so.1
查看>>
VS生成DLL文件供第三方调用
查看>>
Android Studio color和font设置
查看>>
Python 格式化打印json数据(展开状态)
查看>>
Centos7 安装curl(openssl)和libxml2
查看>>
Centos7 离线安装RabbitMQ,并配置集群
查看>>
Centos7 or Other Linux RPM包查询下载
查看>>