BZOJ 3884 (欧拉函数)
2016-07-21 14:06
141 查看
题目链接:点击这里
题意:求2222....%p.
设p=2n+q,那么2222....%p=2n(2(2222....−n)%q)=2n(2(2222....−n)%ϕ(q)%q)
然后一直递归下去直到ϕ(q)=1就可以回溯了。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> #include <map> using namespace std; #define maxn 10050000 #define mod 1000000007 bool vis[maxn]; int phi[maxn], prime[maxn], cnt; void init () { cnt = 0; memset (vis, 0, sizeof vis); phi[1] = 1; for (int i = 2; i < maxn; i++) { if (!vis[i]) { prime[cnt++] = i; phi[i] = i-1; } for (int j = 0; j < cnt; j++) { if (1LL*i*prime[j] >= maxn) break; vis[i*prime[j]] = 1; if (i%prime[j] == 0) { phi[i*prime[j]] = phi[i] * prime[j]; break; } else { phi[i*prime[j]] = phi[i] * (prime[j]-1); } } } } int p; long long qpow (long long b, int p) { if (b == 0) return 1%p; long long ans = qpow (b>>1, p); ans = ans*ans%p; if (b&1) ans = ans*2%p; return ans; } long long dfs (int cur) { if (cur == 1) return 0; int n = 0; while (!(cur&1)) n++, cur >>= 1; long long ans = dfs (phi[cur]); ans = (ans-n%phi[cur]+phi[cur])%phi[cur]; ans = qpow (ans, cur); return ans*(1<<n); } int main () { init (); int t; scanf ("%d", &t); while (t--) { scanf ("%d", &p); printf ("%lld\n", dfs (p)); } return 0; }
相关文章推荐
- 技巧总结篇(一)
- PHP在windows下配置pgsql或pdo_pgsql扩展(找不到libpq.dll的报错解决方法)
- SVN使用教程总结(http://www.cnblogs.com/armyfai/p/3985660.html)
- UISegmentedControl
- Android ListView分两列显示(不用自定义Adapter)
- js实现获取手机ip
- (os/kern) invalid name (15)
- 快学scala 第6章 对象 读书笔记及习题答案代码
- js
- ios 网络状态监听
- ASP.NET MVC4下使用MongoDB实现时间戳和ObjectId相互转换
- 类似微博中的图片布局
- android-auto-scroll-view-pager (无限广告轮播图)
- centos6 安装 directAdmin
- Spring+SpringMVC+Mybatis整合笔记
- Nginx动静分离经典案例配置
- c语言==数组和指针间的联系与区别(10)
- NSLog的格式
- hive regexp_extracl函数用法
- js限时抢购计时器