【BZOJ 3884】 上帝与集合的正确用法 (扩展欧拉定理降幂)
2017-12-24 17:04
363 查看
Description
给定pp,求2222222⋯modp2222222⋯modpSolution
直接用扩展欧拉定理:当x>φ(p)x>φ(p)时,有:ax≡axmodφ(p)+φ(p)(modp)ax≡axmodφ(p)+φ(p)(modp)
由于有无限个22,所以肯定大于φ(p)φ(p),直接用上面的公式降幂即可。
开始只知道p=1p=1时,答案是00,不断递归,用
std::map保存答案。
另外,这样最多只会算log2plog2p次,因为φ(φ(⋯φ(p)))φ(φ(⋯φ(p)))的运算中,如果本来是奇数,就会变成比它小的偶数,偶数至少会变成原来的一半。(另外BZOJ4869也用到了这个性质)
Code
/************************** Au: Hany01 Date: Dec 24th, 2017 Prob: bzoj3884 Email: hany01@foxmail.com **************************/ #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> PII; #define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i) #define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i) #define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i) #define Set(a, b) memset(a, b, sizeof(a)) #define Cpy(a, b) memcpy(a, b, sizeof(a)) #define fir first #define sec second #define pb(a) push_back(a) #define mp(a, b) make_pair(a, b) #define ALL(a) (a).begin(), (a).end() #define SZ(a) ((int)(a).size()) #define INF (0x3f3f3f3f) #define INF1 (2139062143) template <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; } template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; } inline int read() { int _, __; char c_; for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1; for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __; } inline void File() { #ifdef hany01 freopen("bzoj3884.in", "r", stdin); freopen("bzoj3884.out", "w", stdout); #endif } inline int Pow(ll a, int b, int Ha) { ll ret = 1; for ( ; b; b >>= 1, a = a * a % Ha) if (b & 1) (ret *= a) %= Ha; return (int)ret; } inline int phi(int x) { register int t = x; for (register int i = 2; i * i <= x; ++ i) if (!(x % i)) { t -= t / i; while (!(x % i)) x /= i; } if (x > 1) t -= t / x; return t; } int f(int x) { if (x == 1) return 0; int phi_x = phi(x); return Pow(2, f(phi_x) + phi_x, x); } int main() { File(); register int T; T = read(); while (T --) printf("%d\n", f(read())); return 0; } //枝上柳绵吹又少。天涯何处无芳草。 // -- 苏轼《蝶恋花·春景》
相关文章推荐
- 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理
- bzoj 3884 上帝与集合的正确用法 扩展欧拉定理
- 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理
- [BZOJ 3884][欧拉定理]上帝与集合的正确用法
- BZOJ-3884 上帝与集合的正确用法 欧拉定理
- 【BZOJ3884】上帝与集合的正确用法 欧拉定理
- 【BZOJ 3884】上帝与集合的正确用法【欧拉定理】&【剧毒题】
- [bzoj3884]上帝与集合的正确用法 欧拉定理
- BZOJ 3884 上帝与集合的正确用法 (欧拉定理)
- 【BZOJ3884】上帝与集合的正确用法 [欧拉定理]
- (bzoj 3884 上帝与集合的正确用法)<欧拉定理>
- bzoj3884上帝与集合的正确用法 欧拉定理
- 【BZOJ 3884】【欧拉定理或者求幂大法】上帝与集合的正确用法
- 【bzoj3884】上帝与集合的正确用法 欧拉函数+欧拉定理
- [BZOJ 3884]上帝与集合的正确用法:欧拉定理
- 欧拉定理 BZOJ 3884 上帝与集合的正确用法
- 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)
- BZOJ 3884 上帝与集合的正确用法 欧拉定理
- BZOJ 3884 上帝与集合的正确用法 欧拉定理
- 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)