LuoguP4861 按钮
传送门
这题一眼看上去要解\(k^x \equiv 1(mod\ m)\)的最小正整数解。
于是我打了一个扩展BSGS
这题这样做算的答案一直是0的。不过有另一个定理欧拉定理,\(k^{\varphi(m)} \equiv 1 (mod\ m)\)。
首先我们要保证\(gcd(k,m) = 1\),如果不互质的话那就是无解的。
因为有这样一句话:\(k^x mod\ m\)的结果必然是\(gcd(k,m)\)的倍数。我有一些奇怪的理解方法。因为其实这两者都可以看成是\(gcd(k,m)\)的t倍和\(gcd(k,m)\)的p倍。两个\(gcd(k,m)\)的正整数倍互相取模,那答案一定是\(gcd(k,m)\)的倍数了。
于是我们把\(\varphi(m)\)算了出来。但是这不一定是最小的解。
我们可以证明最小的解必然是\(\varphi(m)\)的一个因子。反证法如下:
假设\(n \nmid \varphi(m)\),且n是满足\(k^x \equiv 1 (mod\ m)\)的最小正整数。那么因为\(n \nmid \varphi(m)\),我们可以假设\(pn < \varphi(m) < p(n+1)\),那么就有\(k^{\varphi(m)-pn} \equiv 1 (mod \ m)\),所以n并不是最小正整数解。
所以我们枚举\(\varphi(m)\) 的因子,符合条件且最小的就是答案。
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
#define fr friend inline
#define y1 poj
#define mp make_pair
#define pr pair<int,int>
#define fi first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
const int M = 500005;
const int mod = 999979;
const int INF = 1000000009;
const double eps = 1e-7;
int read()
{
int ans = 0,op = 1;char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();
return ans * op;
}
int k,m,p[M],tot,cnt,ans[M];
bool np[M];
int gcd(int a,int b){return (!b)? a : gcd(b,a%b);}
int mul(int a,int b,int t){return 1ll * a * b % t;}
int qpow(int a,int b,int t)
{
int p = 1;
while(b)
{
if(b & 1) p = mul(p,a,t);
a = mul(a,a,t),b >>= 1;
}
return p;
}
void euler()
{
rep(i,2,M-2)
{
if(!np[i]) p[++tot] = i;
for(int j = 1;i * p[j] <= M-2;j++)
{
np[i * p[j]] = 1;
if(!(i % p[j])) break;
}
}
}
/*
int phi(int x)
{
int res = 1;
rep(i,1,tot)
{
bool flag = 1;
while(!(x % p[i]))
{
x /= p[i];
if(flag) res *= (p[i] - 1),flag = 0;
else res *= p[i];
}
}
if(x > 1) res *= (x-1);
return res;
}
*/
int phi(int x)
{
int res = x;
rep(i,2,sqrt(x)) if(!(x % i)){res = res / i * (i-1);while(!(x%i)) x /= i;}
if(x > 1) res = res / x * (x-1);
return res;
}
int main()
{
euler();
m = read(),k = read();
if(gcd(m,k) != 1) printf("Let's go Blue Jays!\n");
else
{
int g = phi(m);
rep(i,1,sqrt(g))
{
if(qpow(k,i,m) == 1) ans[++cnt] = i;
if(qpow(k,g/i,m) == 1) ans[++cnt] = g / i;
}
sort(ans+1,ans+1+cnt);
printf("%d\n",ans[1]);
}
return 0;
}
LuoguP4861 按钮的更多相关文章
- ExtJS 4.2 Date组件扩展:添加清除按钮
ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...
- 关于Android避免按钮重复点击事件
最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...
- Expression Blend创建自定义按钮
在 Expression Blend 中,我们可以在美工板上绘制形状.路径和控件,然后修改其外观和行为,从而直观地设计应用程序.Button按钮也是Expression Blend最常用的控件之一,在 ...
- 步入angularjs directive(指令)--点击按钮加入loading状态
今天我终于鼓起勇气写自己的博客了,激动与害怕并存,希望大家能多多批评指导,如果能够帮助大家,也希望大家点个赞!! 用angularjs 工作也有段时间了,总体感觉最有挑战性的还是指令,因为没有指令的a ...
- iOS 键盘添加完成按钮,delegate和block回调
这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...
- wordpress优化之结合prism.js为编辑器自定义按钮转化代码
原文链接 http://ymblog.net/2016/07/24/wordpress-prism/ 继昨天花了一天一夜的时间匆匆写了主题Jiameil3.0之后,心中一直在想着优化加速,体验更好,插 ...
- Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.如何判断点击的是哪个方向键按钮 在上篇教程中我们实现了左边的三角形按钮效果, ...
- Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.知识点讲解 当我们点击系统自带的按钮时,按钮的外观会发生变化.上篇博文中我们 ...
- mono for android Listview 里面按钮 view Button click 注册方法 并且传值给其他Activity 主要是context
需求:为Listview的Item里面的按钮Button添加一个事件,单击按钮时通过事件传值并跳转到新的页面. 环境:mono 效果: 布局代码 主布局 <?xml version=" ...
随机推荐
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 SharePoint 2013 App 模型
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 SharePoint 2013 App 模型 你能够通过两个 ...
- webpack+vue起步
本文基于vue1.x 基于vue2.x&webpack2.x请移步至 Vue2.x踩坑与总结Webpack2.x踩坑与总结 记得第一次知道Vue.js是在勾三股四大大的微博,那时候他开始翻译v ...
- class文件无论是32位还是64位jdk编译出来的,都可以通用
class文件无论是32位还是64位jdk编译出来的,都可以通用 学习了:https://blog.csdn.net/z3111001358/article/details/53364066 java ...
- [Guava源代码阅读笔记]-Basic Utilities篇-1
欢迎訪问:个人博客 写该系列文章的目的是记录Guava源代码中个人感觉不错且值得借鉴的内容. 一.MoreObjects类 //MoreObjects.ToStringHelper类的toString ...
- fastjson中Map与JSONObject互换,List与JOSNArray互换的实现
1.//将map转换成jsonObject JSONObject itemJSONObj = JSONObject.parseObject(JSON.toJSONString(itemMap)); 将 ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- 移植alsa-lib遇到的问题
移植alsa-lib遇到的问题 linux audio alsa lib VERSIONED_SYMBOLS 这两天移植alsa lib时遇到了一个问题,被困住了好久. 做个记录,以后再被 ...
- OpenJDK 源码阅读之 LinkedList
概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java ...
- python--软件规范和反射
软件开发规范 写一个作业的时候,要将写的代码分开 bin文件夹里面第一个是start文件 核心代码都在core文件夹里面 文件core最好也是固定名字 BaseDir=os.path.dirna ...
- caffe2 安装与介绍
http://blog.csdn.net/yan_joy/article/details/70241319 标签: 深度学习 2017-04-19 15:31 5970人阅读 评论(0) 收藏 举报 ...