码迷,mamicode.com
首页 > 其他好文 > 详细

【欧拉定理】BZOJ3884-上帝与集合的正确用法

时间:2016-09-28 02:04:36      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:

【题目大意】

求2^(2^(2^(2^(2^...)))) mod p。

【思路】

蒟蒻在知道用欧拉做的前提下,对这题目瞪了好久没有明白,看了正解扑通一声跪下来orz直接搬运popoqqq大爷的吧反正有水印(.

技术分享

【错误点】

快速幂没有开longlong……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 typedef long long ll;
 6 using namespace std;
 7 
 8 int get_phi(int x)
 9 {
10     int res=x;
11     for (int i=2;i*i<=x;i++)
12     {
13         if (x%i==0)
14         {
15             res-=res/i;
16             while (x%i==0) x/=i;
17         }
18     }
19     if (x>1) res-=res/x;
20     return res;
21 }
22 
23 int quick_power(ll x,int y,int MOD)//这里有可能会溢出,用long long
24 {
25     ll ret=1;
26     while (y)
27     {
28         if (y&1) ret=(ret*x)%MOD;
29         x=(x*x)%MOD;
30         y>>=1;
31     }
32     return ret;
33 }
34 
35 int solve(int p)
36 {
37     if (p==1) return 0;
38     int k=0;
39     while (!(p&1)) p>>=1,++k;
40     int phi=get_phi(p);
41     int re=solve(phi);
42     re=(re-k%phi+phi)%phi;
43     int ans=quick_power(2,re,p)%p;
44     return (ans<<k);
45 }
46 
47 void init()
48 {
49     int T;
50     scanf("%d",&T);
51     while (T--)
52     {
53         int p;
54         scanf("%d",&p);
55         printf("%d\n",solve(p));
56     }
57 }
58 
59 int main()
60 {
61     init();
62     return 0;
63 }

 

【欧拉定理】BZOJ3884-上帝与集合的正确用法

标签:

原文地址:http://www.cnblogs.com/iiyiyi/p/5914765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!