PowMod

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1008    Accepted Submission(s): 341

Problem Description
Declare:
k=∑mi=1φ(i∗n) mod 1000000007

n is a square-free number.

φ is the Euler's totient function.

find:
ans=kkkk...k mod p

There are infinite number of k

 
Input
Multiple test cases(test cases ≤100), one line per case.

Each line contains three integers, n,m and p.

1≤n,m,p≤107

 
Output
For each case, output a single line with one integer, ans.
 
Sample Input
1 2 6
1 100 9
 
Sample Output
4
7
 
Author
HIT
 
Source
 
题意:
令K = sigma(phi(i * n)) 1 <= i <= m
求K的超级幂。
题解:

关于下面要用到的欧拉函数的几个证明。
1、首先显然phi(p) = p-1, phi(1) = 1
2、若 n = p^k,则 phi(n) = p^k - p^(k-1)
  证明:显然不互质的有p,2p,......,(p^(k-1)-1)*p,以及p^k
      所以共有p^(k-1)个
3、若 n = a * b, gcd(a, b) == 1, 则phi(n) = phi(a) * phi(b)
  证明:
    phi(a)个与a互质的数,设它们为A1,A2......Aphi(a)
    同理,我们也有B1,B2,.....,Bphi(b)为与b互质的数。
    那么与n互质的数为Ai*b+Bj*a,共有phi(a)*phi(b)个。
    我们来考察Ai*b+Bj*a的性质。
    我们要证明两点:
    1、Ai*b+Bj*a与n互质
    2、除了这些数,没有与n互质的数了。
    第一点、如果有gcd(a*Bi+b*Ai,a*b)=x>1
    那么x|a*b,又gcd(a,b)=1,所以必有x|a或者x|b且不同时成立。
    不妨假设x|a,那么a*Bi/x是个整数,而gcd(Ai,a)=1,所以gcd(Ai,x)=gcd(b,x)=1,
    喜爱内燃此时b*Ai/x不为整数,与x为最大公约数的假设矛盾。
    第二条、这是显然的。。。如果有gcd(x,a*b)!=1,那么gcd(x,a)!=1和gcd(x,b)!=1至少有一条成立。
    所以证毕。
4、若n=p1^k1*p2&k2*.....*pm^km,那么
  phi(n)=n*(1-1/p1)*(1-1/p2)*.....*(1-1/pm)
5、当n>2时,phi(n)是偶数,因为1-1/p=(p-1)/p,p-1必然是偶数。   K = sigma(phi(i * n)) % Q, Q = 1e9+7, 1 <= i <= m
   = sigma(phi( (i * n) / p * p )), p|n
   = sigma(phi( i * n / p * p)), i % p != 0 + sigma(phi( i * n * p)), 1 <= i <= floor(m / p) % Q
   = sigma(phi( i * n / p) * phi(p)), i%p != 0 + sigma(phi(i * (n/p) * p^2)), 1 <= i <= floor(m / p), %Q
   = phi(p) * sigma(phi(i * n / p)), i%p != 0 + sigma(phi(i * (n / p)) * phi(p^2)), 1 <= i <= floor(m/p) %Q
   = phi(p) * sigma(phi(i * n / p)) , i % p != 0 + sigma(phi(i * (n / p)) * p * phi(p)), 1 <= i <= floor(m/p) %Q
   = phi(p) * sigma(phi(i * n / p)) , i % p != 0 + sigma(phi(i * (n / p)) * (phi(p) + 1) * phi(p)), 1 <= i <= floor(m/p) %Q
   = phi(p) * ( sigma(phi(i * n / p)), i % p != 0 + sigma(phi(i * n)), 1<=i<=floor(m/p) ) + sigma(phi(i * n)), 1<=i<=floor(m/p) %Q
   = phi(p) * sigma(phi(i * (n / p))), 1 <= i <= m + sigma(phi(i * n)), 1 <= i <= floor(m / p)
令F(m,n) = sigma(phi(i * n)) % Q,
根据上述证明,有当p|n时,
F(m, n) = phi(p) * F(m, n / p) + F(floor(m / p), n) %Q
所以可以递归计算F(m, n), 这一步复杂度为O((number of P)^2)   当算出K值后,需要计算它的超级幂。
有A^B mod C = A^(B % phi(C) + phi(C)) % C
这个证明我不会,网上有证明,但因为年代久远,百度博客搬迁,原地址没了。。。
(实际上这个的作用除了计算超级幂好像没什么用。。。。(这只是弱鸡的视野
事实上,这里的A跟B是一个东西,而phi(C)是不断减少的,只有phi(1)==1,
而且收敛速度很快。
所以不断递归就好啦。

  

 const int N = , MOD = 1e9 + ;
int prime[N], tot;
bool notPrime[N];
int phi[N], sumphi[N]; int n, m, p;
int factor[N], totFactor; inline int add(int x, int y, int MOD = MOD) {
return ((x + y) % MOD + MOD) % MOD;
} inline int mul(int x, int y, int MOD = MOD) {
return ((x * 1ll * y) % MOD + MOD) % MOD;
} inline void getPrime() {
phi[] = , sumphi[] = ;
for(int i = ; i < N; ++i) {
if(!notPrime[i]) prime[tot++] = i, phi[i] = i - ;
for(int j = ; j < tot; ++j) {
if(i * prime[j] >= N) break;
notPrime[i * prime[j]] = true;
if(i % prime[j]) phi[i * prime[j]] = phi[i] * phi[prime[j]];
else {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
sumphi[i] = add(phi[i], sumphi[i - ]);
}
} inline void getFactor(int x) {
totFactor = ;
for(int i = ; i < tot; ++i)
if(!(x % prime[i])) {
factor[totFactor++] = prime[i];
x /= prime[i];
if(x <= ) break;
}
} inline int f(int index, int m, int n) {
if(index >= totFactor || n == ) return sumphi[m]; // n == 1
if(m <= ) return ;
int part1 = f(index + , m, n / factor[index]),
part2 = f(index, m / factor[index], n);
return add(mul(phi[factor[index]], part1), part2);
} inline int fastpow(int basic, int times, int p) {
int ret = ;
while(times) {
if(times & ) ret = mul(ret, basic, p);
basic = mul(basic, basic, p), times >>= ;
}
return ret;
} inline int superPower(int k, int p) {
/**
* 1. k^X mod p = k^(X mod phi(p) + phi(p)) mod p X = k^k^k.....
* 2. fastpow(x, y, z) x^y mod z
* */
if(p == ) return ;
int powers = superPower(k, phi[p]) + phi[p];
return fastpow(k, powers, p);
} inline void solve() {
getFactor(n);
int k = f(, m, n);
int ans = superPower(k, p);
printf("%d\n", ans);
} int main() {
getPrime();
while(scanf("%d%d%d", &n, &m, &p) == ) solve();
return ;
}

2016 Multi-University Training Contest 1 F.PowMod的更多相关文章

  1. 2016 Al-Baath University Training Camp Contest-1 F

    Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...

  2. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  3. 2016 Al-Baath University Training Camp Contest-1 E

    Description ACM-SCPC-2017 is approaching every university is trying to do its best in order to be th ...

  4. 2016 Al-Baath University Training Camp Contest-1 A

    Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...

  5. [CFGym101028] 2016 Al-Baath University Training Camp Contest-1

    比赛链接:http://codeforces.com/gym/101028/ 由于实习,几乎没有时间刷题了.今天下午得空,断断续续做了这一套题,挺简单的. A.读完题就能出结果. /* ━━━━━┒ギ ...

  6. 2016 Al-Baath University Training Camp Contest-1 J

    Description X is fighting beasts in the forest, in order to have a better chance to survive he's gon ...

  7. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  8. 2016 Al-Baath University Training Camp Contest-1 H

     Description You've possibly heard about 'The Endless River'. However, if not, we are introducing it ...

  9. 2016 Al-Baath University Training Camp Contest-1 G

    Description The forces of evil are about to disappear since our hero is now on top on the tower of e ...

随机推荐

  1. php工厂方法

    <?php interface db{ function conn(); } interface Factory{ function createDB(); } class dbmysql im ...

  2. 关于jquery 集合对象的 each和click方法的 思考 -$(this)的认识

    1, 很重要的是: each: 是 自动遍历 集合中所有 item的, 是自动的; click: 包括其他所有的 "事件", 如mouseX事件, keyX事件等, 都不是 自动 ...

  3. C#之关机事件

    一.背景 做了个APP,通过向下位机发送串口数据,然后通过串口去控制多路光源,现在的问题来了,若是电脑强行关机,而APP又没在电脑关机前做任何动作,导致电脑已经关机了,而下位机控制的灯源还在工作.所以 ...

  4. PF_INET 和 AF_INET 的区别

    在写网络程序的时候,建立TCP socket: sock = socket(PF_INET, SOCK_STREAM, 0); 然后再绑定本地地址或连接远程地址时需要初始化sockaddr_in结构, ...

  5. django orm字段和参数

    字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=Tr ...

  6. python之路五

    内建模块 time和datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现 ...

  7. Oracel基础知识

    1.查看oracle环境变量命令  echo  %path% 2.监听程序:Oracle服务器端的一种网络服务.监听程序创建在数据库的服务器端,主要作用监视客户的连接请求.因此在客户端创建监听毫无意义 ...

  8. ACM/ICPC 之 Dinic算法(POJ2112)

    Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...

  9. VC++ 制作一个简易的控制台时钟应用

    1.下载EasyX Library for C++ (http://www.easyx.cn/) 直接下载:EasyX_20151015(beta) EasyX 绘图库目前支持 Visual C++ ...

  10. Ruby多行字符串,begin/end语句、注释

    #!/usr/bin/ruby #puts "Hello ,Ruby!"; print <<EOF #多行字符串 以<<开头 紧接着为结束字符串标识声明 并 ...