题目链接

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;
}

最新文章

  1. Python之路【第七篇】python基础 之socket网络编程
  2. arcgis api for flex之专题图制作(饼状图,柱状图等)
  3. STM32电机控制器小心得
  4. 第二题 已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利
  5. LeetCode Integer to English Words
  6. NeHe OpenGL教程 第二十二课:凹凸映射
  7. SwfUpload vs里运行可以上传文件,放到iis上上传就报404错误。
  8. ASP连接11种数据库的常用语法
  9. Calendar - SGU 115(日期判断)
  10. 转:ElasticSearch的安装和相关插件的安装
  11. fuse 虚拟文件系统 的 安装与使用
  12. BOW
  13. SL.XNA中的Popup
  14. mac下安装 resin 奇葩问题总结
  15. NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes
  16. 【数学建模】day04-插值与拟合
  17. 编译lua动态库
  18. centos7救援模式--rescue模式
  19. 第三方API使用的好习惯
  20. Web 文件上传方面的安全问题

热门文章

  1. requests和BeautifulSoup模块的使用
  2. react数据渲染
  3. Elasticsearch的安装入门
  4. 配置 admin 页面
  5. 单元测试unittest及报告生成(两种报告模板)
  6. [ML] Machine Learning in the Common Infrastructure ecosystem
  7. python+Selenium PhantomJS网页截图
  8. plsql 查询中文乱码问题
  9. Postman的安装和升级
  10. kubeadm安装集群系列-3.添加工作节点