题目链接

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题解上帝与集合的正确用法--扩展欧拉定理的更多相关文章

  1. 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理

    题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容 ...

  2. 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)

    [BZOJ3884]上帝与集合的正确用法(欧拉定理,数论) 题面 BZOJ 题解 我们有欧拉定理: 当\(b \perp p\)时 \[a^b≡a^{b\%\varphi(p)}\pmod p \] ...

  3. 洛谷P4139 上帝与集合的正确用法 [扩展欧拉定理]

    题目传送门 上帝与集合的正确用法 题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”. ...

  4. bzoj3884: 上帝与集合的正确用法 扩展欧拉定理

    题意:求\(2^{2^{2^{2^{...}}}}\%p\) 题解:可以发现用扩展欧拉定理不需要很多次就能使模数变成1,后面的就不用算了 \(a^b\%c=a^{b\%\phi c} gcd(b,c) ...

  5. BZOJ.3884.上帝与集合的正确用法(扩展欧拉定理)

    \(Description\) 给定p, \(Solution\) 欧拉定理:\(若(a,p)=1\),则\(a^b\equiv a^{b\%\varphi(p)}(mod\ p)\). 扩展欧拉定理 ...

  6. BZOJ 3884: 上帝与集合的正确用法 扩展欧拉定理 + 快速幂

    Code: #include<bits/stdc++.h> #define maxn 10000004 #define ll long long using namespace std; ...

  7. 【BZOJ3884】上帝与集合的正确用法 [欧拉定理]

    上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Input 第一行一个T ...

  8. BZOJ3884: 上帝与集合的正确用法 拓展欧拉定理

    Description   根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“ ...

  9. 【bzoj3884】 上帝与集合的正确用法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3884 (题目链接) 题意 求 Solution 解决的关键: 当${n>φ(p)}$,有$${ ...

随机推荐

  1. pytorch-VGG网络

    VGG网络结构 第一层: 3x3x3x64, 步长为1, padding=1 第二层: 3x3x64x64, 步长为1, padding=1 第三层: 3x3x64x128, 步长为1, paddin ...

  2. GC垃圾回收 | 深入理解G1垃圾收集器和GC日志

    来源:并发编程网链接:http://ifeve.com/深入理解G1垃圾收集器/ G1 GC是Jdk7的新特性之一.Jdk7+版本都可以自主配置G1作为JVM GC选项:作为JVM GC算法的一次重大 ...

  3. 【SR汇总】算法时间效率

    1.SRCNN-0.39s SRCNN处理速度. 论文:Learning a Deep Convolutional Network forImage Super-Resolution 中,4.2节. ...

  4. 因OpenCV版本不一致所引发的报错

    目录 一 因OpenCV版本不一致所引发的报错 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 因OpenCV版本不一致所引发的报错 今天遇到了一个很有意思的报错. 事情是这样的, 在编译& ...

  5. umask 介绍

    umask码 是用户创建文件或目录的初始权限设置值 文件或目录的权限:读: r — 4写: w — 2执行: x — 1 输入umask 查看umask 码 设定umask码,umask 0033 1 ...

  6. 解决Hash碰撞冲突的方法

    Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰 ...

  7. Java集合(3):使用Abstract类

    每个java.util容器都有其自己的Abstract类,它们提供了该容器接口的部分实现.下面是一个定制自己的Map的例子(List set就省略了): 定制自己的Map实现AbstractMap-- ...

  8. centos7 忘记mysql root登录密码

    1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的状态下,其他的用户也可以任意地登录和 ...

  9. 第四章 信息收集之nmap

    @nmap扫描工具 nmap是使用最广泛的扫描工具,主要的使用范围有,嗅探,扫描,ping. 局域网扫描 nmap扫描的基本命令: 首先在桌面右键选择open in terminal进入命令窗口,输入 ...

  10. android#ListView的简单用法

    新建项目,并修改项目生产的主文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ap ...