BZOJ3884题解上帝与集合的正确用法--扩展欧拉定理
题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=3884
分析
扩展欧拉定理裸题
欧拉定理及证明:
如果\((a,m)=1\),则\(a^{\phi(m)} \equiv 1 \mod m\)
\(Prove:\)设\(x\)取遍\(m\)的缩系,则\(ax\)取遍\(m\)的缩系,即
\[\prod x = \prod ax \mod m
\]因为这样的\(a\)有\(\phi(m)\)个
\[\prod x = \prod x *a^{ \phi(m)} \mod m
\]由于\((x,m)=1\),保证\(\prod x\) 存在模\(m\)意义下的逆元
所以 $$a^{ \phi(m)} \equiv 1 \mod m$$
扩展欧拉定理:
如果 $$(a,m)!=1$$
则 $$a^b \equiv a^{min(b,b % \phi(m)+\phi(m))} \mod m$$设\(f(x)\)为在模\(x\)意义下题目式子的值,那么$$f(x)=2{2{^{...}}%\phi(x)+\phi(x)} \mod x=2^{f(\phi(x))+\phi(x)} \mod x$$
然后就可以记忆化搞一搞了
注意
求欧拉函数可以线性预处理也可以直接求,实践证明直接求不知道快到哪里去了
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#define ll long long
#define ri register int
using std::sort;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=10000005;
const int inf=0x7fffffff;
int t,n;
int mem[maxn];
int phi[maxn];
bool vis[maxn];
inline void get_table(){
bool is_pri[maxn];
int num[1000005],tot=0,tmp;
memset(is_pri,0,sizeof(is_pri));
is_pri[1]=1;
phi[1]=1;
for(ri i=2;i<=maxn;i++){
//printf("%d\n",i);
if(!is_pri[i]){
num[++tot]=i;
phi[i]=i-1;
}
for(ri j=1;j<=tot;j++){
tmp=num[j]*i;
if(tmp>=maxn)break;
is_pri[tmp]=1;
if(i%num[j]==0){
phi[tmp]=num[j]*phi[i];
break;
}
else {
phi[tmp]=(num[j]-1)*phi[i];
}
}
}
return ;
}
inline int get_phi(int x){
int res=x;
for(ri i=2;i*i<=n;i++){
if(x%i==0){
res=res/i*(i-1);
while(x%i==0)x=x/i;
}
}
if(x>1)res=res/x*(x-1);
return res;
}
int ksm(ll x,int c,int p){
ll ans=1,res=x;
while(c){
if(c&1)ans=ans*res%p;
res=res*res%p;
c=c>>1;
}
return ans%p;
}
int f(int x){
if(x==1)return 0;
if(vis[x])return mem[x];
int p=phi[x];//int p=get_phi(x);
vis[x]=1;
mem[x]=ksm(2,f(p)+p,x);
return mem[x];
}
int main(){
read(t);
get_table();
while(t--){
read(n);
printf("%d\n",f(n));
}
return 0;
}
BZOJ3884题解上帝与集合的正确用法--扩展欧拉定理的更多相关文章
- 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理
题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容 ...
- 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)
[BZOJ3884]上帝与集合的正确用法(欧拉定理,数论) 题面 BZOJ 题解 我们有欧拉定理: 当\(b \perp p\)时 \[a^b≡a^{b\%\varphi(p)}\pmod p \] ...
- 洛谷P4139 上帝与集合的正确用法 [扩展欧拉定理]
题目传送门 上帝与集合的正确用法 题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”. ...
- bzoj3884: 上帝与集合的正确用法 扩展欧拉定理
题意:求\(2^{2^{2^{2^{...}}}}\%p\) 题解:可以发现用扩展欧拉定理不需要很多次就能使模数变成1,后面的就不用算了 \(a^b\%c=a^{b\%\phi c} gcd(b,c) ...
- BZOJ.3884.上帝与集合的正确用法(扩展欧拉定理)
\(Description\) 给定p, \(Solution\) 欧拉定理:\(若(a,p)=1\),则\(a^b\equiv a^{b\%\varphi(p)}(mod\ p)\). 扩展欧拉定理 ...
- BZOJ 3884: 上帝与集合的正确用法 扩展欧拉定理 + 快速幂
Code: #include<bits/stdc++.h> #define maxn 10000004 #define ll long long using namespace std; ...
- 【BZOJ3884】上帝与集合的正确用法 [欧拉定理]
上帝与集合的正确用法 Time Limit: 5 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Input 第一行一个T ...
- BZOJ3884: 上帝与集合的正确用法 拓展欧拉定理
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“ ...
- 【bzoj3884】 上帝与集合的正确用法
http://www.lydsy.com/JudgeOnline/problem.php?id=3884 (题目链接) 题意 求 Solution 解决的关键: 当${n>φ(p)}$,有$${ ...
随机推荐
- requests和BeautifulSoup模块的使用
用python写爬虫时,有两个很好用第三方模块requests库和beautifulsoup库,简单学习了下模块用法: 1,requests模块 Python标准库中提供了:urllib.urllib ...
- 1.springboot内置tomcat的connection相关
最近在研究tomcat的连接超时问题,环境:jdk1.8 + springboot 2.1.1.RELEASE,以下仅为个人理解,如果异议,欢迎指正. springboot的tomcat的几个配置参数 ...
- ios-Runtime调用私有方法
有时在代码中会有需要调用私有方法的场景,如不想import太多头文件:想组件设计一些解耦的模块:查看别人模块中未暴露的代码进行分析等. 在 ios 中调用私有方法有很多种方式,主要是通过Runtime ...
- DeviceUtils
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> import androi ...
- python之NLP词性标注
1.知识点 包括中文和英文的词性标注主要使用的库是nltk和jiaba 2.代码 # coding = utf-8 import nltk from nltk.corpus import stopwo ...
- C#Application:Exit与ExitThread 解释
Application.Exit(); 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口 Application.ExitThread 方法 退出当前线程上的消息循环,并关闭该线程上的 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-04 自定义Zuul过滤器实现登录
笔记 4.自定义Zuul过滤器实现登录鉴权实战 简介:自定义Zuul过滤器实现登录鉴权实战 1.新建一个filter包 2.新建一个类,实现ZuulFilter,重写里面的方法 3.在类顶部加 ...
- Android提升Gradle编译速度或减少Gradle编译时间.md
目录 Android如何提升Gradle编译速度或减少Gradle编译时间 最终优化方案 优化效果比对 将所有项目源码,各种缓存临时目录都移动到高性能SSD磁盘上 gradle.properties ...
- hutool-all 包把实体Bean转化成字符串,以及把字符串转化成Bean对象
GxyJobEntity gxyJobEntity1 = new GxyJobEntity(); gxyJobEntity1.setUserId("user001"); gxyJo ...
- docker版的zabbix部署
环境准备:一台server端,两台agent端 server端部署zabbix-server和mariadb服务 agent端部署zabbix-agent服务 一.docker容器里下载zabbix和 ...