HDU 5728 PowMod
2016-07-20 21:34
501 查看
Description
Declare:
k=∑mi=1φ(i∗n) mod 1000000007
n is a square-free number.
φ is the Euler’s totient function.
find:
ans=kkkk...kmod p
There are infinite number of k
Solution
比赛时候没推出来。。
下面那个很好搞,和BZOJ3884一样咯,递归搞定
关键是上面
首先令sum(n,m)=∑mi=1φ(i∗n) mod 1000000007
因为φ是积性函数,那么令p为n的一个因数
则可以得到sum(n,m)=φ(p)∗∑mi=1φ(i∗n/p)+∑floor(m/p)i=1φ(i∗n) ...................(1)
关于上面这个式子的推导:
对于那些和p互质的i , φ(i∗n)=φ(i∗n/p)∗φ(p)(积性函数的定义咯)
对于那些和p不互质的i,φ(i∗n)=φ(i∗n/p)∗p(欧拉函数的定义,要证明的话可以用剩余系)
又p是个素数,则φ(p)=p−1,式(1)得证。
于是式(1)可以简化为sum(n,m)=φ(p)∗sum(n/p,m)+sum(n,floor(m/p))
于是k可以在远小于log次调用递归里得到。
当然,关于之前那个k的无限次方,题解还有更好的方式(不用每次提项了)
题解给出一个公式ab mod p=aφ(p)+b mod φ(p)
还有证明
然后在这道题里kkkk...k是无限大的,所以可以衣食无忧的用哪个公式。
总之有了这个公式后那个BZOJ3884变成了递归入门题PoPoQQQ大爷,我绝无冒犯您的意思。。
数论还是很(ao)有(miao)意(chong)思(chong)的
Code
Declare:
k=∑mi=1φ(i∗n) mod 1000000007
n is a square-free number.
φ is the Euler’s totient function.
find:
ans=kkkk...kmod p
There are infinite number of k
Solution
比赛时候没推出来。。
下面那个很好搞,和BZOJ3884一样咯,递归搞定
关键是上面
首先令sum(n,m)=∑mi=1φ(i∗n) mod 1000000007
因为φ是积性函数,那么令p为n的一个因数
则可以得到sum(n,m)=φ(p)∗∑mi=1φ(i∗n/p)+∑floor(m/p)i=1φ(i∗n) ...................(1)
关于上面这个式子的推导:
对于那些和p互质的i , φ(i∗n)=φ(i∗n/p)∗φ(p)(积性函数的定义咯)
对于那些和p不互质的i,φ(i∗n)=φ(i∗n/p)∗p(欧拉函数的定义,要证明的话可以用剩余系)
又p是个素数,则φ(p)=p−1,式(1)得证。
于是式(1)可以简化为sum(n,m)=φ(p)∗sum(n/p,m)+sum(n,floor(m/p))
于是k可以在远小于log次调用递归里得到。
当然,关于之前那个k的无限次方,题解还有更好的方式(不用每次提项了)
题解给出一个公式ab mod p=aφ(p)+b mod φ(p)
没有欧拉公式的互素的限制!!!
但是好像有其他限制:b>=φ(p),比如这有组反例(2,1,4),当然反例是不满足那个限制的,详情可见知乎还有证明
然后在这道题里kkkk...k是无限大的,所以可以衣食无忧的用哪个公式。
总之有了这个公式后那个BZOJ3884变成了递归入门题PoPoQQQ大爷,我绝无冒犯您的意思。。
数论还是很(ao)有(miao)意(chong)思(chong)的
Code
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> using namespace std; const int M=1e7+5; const int P=1e9+7; bool mark[M]; int prime[M],phi[M],sum[M],t; inline int Mod(int b){return b>=P?b-P:b;} inline void pret(){ phi[1]=1; for(int i=2;i<M;++i){ if(!mark[i])prime[t++]=i,phi[i]=i-1; for(int j=0;j<t&&1ll*prime[j]*i<M;++j){ mark[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[prime[j]*i]=phi[i]*(prime[j]-1); } } for(int i=1;i<M;++i) sum[i]=Mod(sum[i-1]+phi[i]); } inline int work(int n,int m){ if(n==1)return sum[m]; if(m==1)return phi ; if(m<1)return 0; for(int i=0;prime[i]*prime[i]<=n;++i){ if(n%prime[i]==0) return Mod(1ll*phi[prime[i]]*work(n/prime[i],m)%P+work(n,m/prime[i])); } return Mod(1ll*phi *work(1,m)%P+work(n,m/n)); } inline int Mod_Pow(int x,int a,int mod){ int res=1; for(int i=0;(1ll<<i)<=a;++i){ if(a&1<<i)res=1ll*res*x%mod; x=1ll*x*x%mod; } return res; } int n,m,p,k; inline int gao(int mod){ if(mod==1)return 0; int s=gao(phi[mod]); return Mod_Pow(k,s+phi[mod],mod); } int main(){ for(pret();cin>>n>>m>>p;){ k=work(n,m); cout<<gao(p)<<endl; } return 0; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Project Euler Problem 387 - Harshad Numbers - 深度优先
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- 编程之美2015初赛A
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016