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=" ...
随机推荐
- extern “C”的使用
2016-12-11 22:40:48 VS编译的时候,可以指定编译为C代码或者C++代码.c/c++->高级.而当你新建一个cpp文件时,VS很有可能自动会把编译方式由C变成C++编译.然 ...
- C#串口通信发送数据
1 发送数据 需要2个串口 http://www.openedv.com/thread-228847-1-1.html 下载源文件 File_Protocol_Test.rar
- jstl的函数
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@ tag ...
- C/C++程序到内存分配(转)
一.一个由C/C++编译到程序占用的内存分为以下几个部分: 1.栈区(stack)——由编译器自动分配释放,在不需要的时候自动清除.用于存放函数的参数.局部变量等.操作方式类似数据结构中的栈(后进先出 ...
- 有关C/C++指针的经典面试题(转)
参考一: 有关C/C++指针的经典面试题 0.预备知识,最基础的指针 其实最基础的指针也就应该如下面代码: int a; int* p=&a; 也就是说,声明了一个int变量a,然后声明一个i ...
- linux与python
linux一般都装有python,但是版本不一定,需要自己查看,如果版本过低,需要重装.查看python版本方法,直接在命令行输入 python,此时会进入python命令行,同时会显示python版 ...
- bat+sqlcmd 批量执行脚本
Hello,此BAT脚本能够帮助开发者将某目录下全部SQL脚本按文件名称依次在指定数据库中批量执行. 不用忍受powershell invoke-sqlcmd 的笨重.在指执行时多一种选择. bat文 ...
- 笔记本Charge与Vcore方案
一.笔记本Vcore方案 EC管理智能电池的方案名词简介 我所知道的EC====>Battery 立錡VCORE解決方案簡介 ATX Power Supply 涡轮加速升压(turbo-boo ...
- 找回Xcode7的代码折叠功能
升级到Xcode7后,会发现代码折叠功能不见了,这是怎么回事? 其实这个功能还在的,用以下的快捷键仍然可以折叠代码.只是不能用鼠标实现折叠了:在Xcode菜单里选择Preference——Text E ...
- 服务管理-Nginx
nginx优势 select,epoll模型 对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间.所以说.当一个read ...