[BZOJ3884]上帝与集合的正确用法 欧拉函数
来源:互联网 发布:android源码设计模式 编辑:程序博客网 时间:2024/05/06 07:00
求ANS=2^2^2^2^2…mod p的值。
设ANS=2^n,假设2^k||p,那么2^(n-k)=ooo (mod p/2^k) ,ANS=ooo*2^k<满足欧拉定理的条件,于是2^((n-k)%φ(p/2^k))=ooo (mod p/2^k) 转化为求n%φ(p/2^k),因为n和ANS都是相同形式,递归即可。边界是p==1是返回0。
代码:
#include<iostream>#include<cstdio>#define ll long longusing namespace std;int num,pri[1000010],phi[10000010];bool flag[10000010];void getpri(int n){ flag[1]=1;phi[1]=1; for(int i=2;i<=n;i++) { if(!flag[i]) {pri[++num]=i;phi[i]=i-1;} for(int j=1;j<=num&&i*pri[j]<=n;j++) { flag[i*pri[j]]=1; if(i%pri[j]==0) {phi[i*pri[j]]=phi[i]*pri[j];break;} else phi[i*pri[j]]=phi[i]*(pri[j]-1); } }}ll ksm(ll a,ll b,int mod){ll re=1; while(b){if(b&1)re=re*a%mod;a=a*a%mod;b>>=1;} return re;}ll solve(int x){ ll tmp=0; while(!(x&1)){x>>=1;tmp++;} if(x==1) return 0; return ksm(2,((solve(phi[x])-tmp)%phi[x]+phi[x])%phi[x],x)*(1ll<<tmp);}int main(){ getpri(10000000); int ca; scanf("%d",&ca); while(ca--) { int mod; scanf("%d",&mod); printf("%lld\n",solve(mod)); }}
阅读全文
0 0
- BZOJ3884 上帝与集合的正确用法 [欧拉函数]
- [BZOJ3884]上帝与集合的正确用法 欧拉函数
- [bzoj3884]上帝与集合的正确用法 欧拉定理
- bzoj3884上帝与集合的正确用法 欧拉定理
- BZOJ3884 上帝与集合的正确用法(欧拉函数)
- 【BZOJ3884】【欧拉函数】上帝与集合的正确用法 题解
- BZOJ3884 上帝与集合的正确用法
- 【BZOJ3884】上帝与集合的正确用法
- BZOJ3884: 上帝与集合的正确用法
- 【Bzoj3884】上帝与集合的正确用法
- bzoj3884 上帝与集合的正确用法
- bzoj3884 上帝与集合的正确用法
- 【bzoj3884】上帝与集合的正确用法
- BZOJ3884 上帝与集合的正确用法
- BZOJ3884 上帝与集合的正确用法 (欧拉定理)
- 数论专题练习:【bzoj3884】上帝与集合的正确用法
- 【bzoj3884】【上帝与集合的正确用法】【数论】
- bzoj3884上帝与集合的正确用法+无限次幂取膜
- Redhat版本linux学习
- React Native 混合编程 之移植项目
- JDBC Transaction 示例
- 字符统计对比
- 线程局部存储TLS(thread local storage)
- [BZOJ3884]上帝与集合的正确用法 欧拉函数
- React Native 混合编程 之访问原生API
- Android中公用属性的抽取
- libsamplerate的使用
- 三子棋游戏
- Codeforces 858A. k-rounding 数论
- 基于Flask + MongoDB + Scrapy + ElasticSearch的新闻检索平台(ES+MongoDB环境)
- 北工大菜鸟的AI成长之路从今天开始啦!
- Can't find bundle for base name 包名.xxxx.文件名,locale 语言简称_国家简称