HDU-5728-PowMod-求phi(i*n)前缀和+指数循环节
HDU-5728-PowMod-求phi(i*n)前缀和+指数循环节
【Problem Description】
令\(k=\sum_{i=1}^m \varphi(i\cdot n)\ mod \ (10^9+7)\)。求\(k^{k^{k^{\dots}}}\ mod \ p\)。
【Solution】
因为\(n\)的所有质因子的幂次都为\(1\),所以有\(gcd(p,\frac{n}{p})=1\)。其中\(p\)为\(n\)的最小质因子
- 假设\(i\ mod \ p\ne 0\),则有\(gcd(i\cdot \frac{n}{p},p)=1\)。因此有\(\varphi(i\cdot n)=\varphi(i\cdot \frac{n}{p}\cdot p)=\varphi(i\cdot \frac{n}{p})\cdot \varphi(p)\)。
- 假设\(i\ mod \ p=0\),则有\(gcd(i\cdot \frac{n}{p},p)=p\)。因此有\(\varphi(i\cdot n)=\varphi(i\cdot \frac{n}{p}\cdot p)=\varphi(i\cdot \frac{n}{p})\cdot p\)。
根据以上两条性质可得,令\(f(m,n)=\sum_{i=1}^m\varphi(i\cdot n)\):
\\=\varphi(p)\sum_{i\ mod\ p\ne 0}\varphi(i\cdot \frac{n}{p})+\sum_{i\ mod \ p=0}\varphi(i\cdot \frac{n}{p})\cdot(\varphi(p)+1)
\\=\varphi(p)\cdot\Bigg(\sum_{i\ mod\ p\ne0}\varphi(i\cdot \frac{n}{p})+\sum_{i\ mod\ p=0}\varphi(i\cdot \frac{n}{p}) \Bigg)+\sum_{i\ mod \ p=0}\varphi(i\cdot \frac{n}{p})
\\=\varphi(p)\cdot\sum_{i=1}^m\varphi(i\cdot \frac{n}{p})+\sum_{i=1}^{\frac{m}{p}}\varphi(i\cdot n)
\]
所以可得:\(f(m,n)=\varphi(p)\cdot f(m,\frac{n}{p})+f(\frac{n}{p},n)\)。这是一个递推式,可用递归求得。到此我们求得了\(k\)的值。
对于\(k^{k^{k^{\dots}}}\ mod \ p\)可以用扩展欧拉定理进行欧拉降幂即可。
【Code】
/*
* @Author: Simon
* @Date: 2019-09-02 18:00:24
* @Last Modified by: Simon
* @Last Modified time: 2019-09-02 20:22:51
*/
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 10000005
typedef long long LL;
const int mod=1e9+7;
int prime[maxn],cnt=0;
LL phi[maxn],sum[maxn];
bool vis[maxn];
void Euler(){
phi[1]=1;
for(int i=2;i<maxn;i++){
if(!vis[i]){
prime[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(int i=1;i<maxn;i++) sum[i]=(sum[i-1]+phi[i])%mod;
}
int dfs(int m,int n){
if(n==1) return sum[m];
if(m==0) return 0;
for(int i=2;i*i<=n;i++){ //找最小质因子
if(n%i==0){
return (phi[i]*1LL*dfs(m,n/i)%mod+dfs(m/i,n))%mod;
}
}
if(n>1) return (phi[n]*dfs(m,n/n)%mod+dfs(m/n,n))%mod; //n本身就是素数
}
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int fpow(int a,int b,int mod){
a%=mod;int ans=1;
while(b){
if(b&1) ans=ans*1LL*a%mod;
a=a*1LL*a%mod;
b>>=1;
}
return ans;
}
int f(int k,int m){ //递归欧拉降幂
if(m==1) return 0;
int p=phi[m];
int t=f(k,p);
int g=gcd(k,m);
if(g==1) return fpow(k,t,m);
else return fpow(k,t+p,m);
}
int main(){
#ifndef ONLINE_JUDGE
//freopen("input.in","r",stdin);
//freopen("output.out","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);Euler();
int n,m,p;
while(cin>>n>>m>>p){
int k=dfs(m,n);
cout<<f(k,p)%p<<endl;
}
#ifndef ONLINE_JUDGE
cout<<endl;system("pause");
#endif
return 0;
}
HDU-5728-PowMod-求phi(i*n)前缀和+指数循环节的更多相关文章
- HDU 5728 - PowMod
HDU 5728 - PowMod 题意: 定义: k = ∑(i=1,m) φ(i∗n) mod 1000000007 给出: n,m,p ,且 n 无平方因子 求: ans= k^(k^(k ...
- HDU3977 Evil teacher 求fib数列模p的最小循环节
In the math class, the evil teacher gave you one unprecedented problem! Here f(n) is the n-th fibona ...
- HDU - 5728:PowMod (欧拉函数&指数循环节)
Declare: k=∑ m i=1 φ(i∗n) mod 1000000007 k=∑i=1mφ(i∗n) mod 1000000007 n n is a square-free number. φ ...
- 【转】【关于 A^x = A^(x % Phi(C) + Phi(C)) (mod C) 的若干证明】【指数循环节】
[关于 A^x = A^(x % Phi(C) + Phi(C)) (mod C) 的若干证明][指数循环节] 原文地址:http://hi.baidu.com/aekdycoin/item/e493 ...
- PowMod (欧拉推式子 + 指数循环节)
最主要的步骤是用 1式子和2式子推 3式子.(难点,看了很多博客最后的时候那个式子看不懂) 当n, m互质时即gcd(n, m) == 1,存在phi(n * m) = phi(m) * phi(n) ...
- hdu 3307 简单的指数循环节
#include<stdio.h>#include<string.h>#include<algorithm>#define LL __int64using name ...
- hdu_2837_Calculation(欧拉函数,快速幂求指数循环节)
Assume that f(0) = 1 and 0^0=1. f(n) = (n%10)^f(n/10) for all n bigger than zero. Please calculate f ...
- HDU 3746 - Cyclic Nacklace & HDU 1358 - Period - [KMP求最小循环节]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- Hdu 1358 Period (KMP 求最小循环节)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目描述: 给出一个字符串S,输出S的前缀能表达成Ak的所有情况,每种情况输出前缀的结束位置和 ...
随机推荐
- JS扩展Array.prototype引发的问题及解决方法
遇到的问题 一上班收到个bug,写的表单联动插件在ie里面会出现js源码,当时有点意外,从没出现过这问题. 问题的原由 为什么会出现一个function呢?其它调用的插件的页面为什么没有这问题? 控制 ...
- 【ARM-Linux开发】ctrl-xxx的对应的signal含义
ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程.常用于终止正在运行的程序.ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程.ctrl-d 不是发送信 ...
- Appium移动自动化测试-----(六)3.AppiumDesktop功能描述
一般功能 这些能力跨越多个驱动因素. 能力 描述 值 automationName 使用哪个自动化引擎 Appium(默认)或Selendroid或者UiAutomator2或者Espresso对于A ...
- LeetCode 637. 二叉树的层平均值(Average of Levels in Binary Tree)
637. 二叉树的层平均值 637. Average of Levels in Binary Tree LeetCode637. Average of Levels in Binary Tree 题目 ...
- Quartz.Net—配置化
Schedule配置 线程数量 如果一个Schedule中有很多任务,这样默认的10个线程就不够用了. 有很多种方法配置线程的个数. 工厂构造函数 webfonfig quartzconfig 环境变 ...
- WUSTOJ 1335: Similar Word(Java)
题目链接:1335: Similar Word Description It was a crummy day for Lur. He failed to pass to the CET-6 (Col ...
- AVR单片机教程——如何使用本教程
这是一篇元教程(meta-tutorial)——其他教程教你怎么使用AVR单片机,本篇教程教你如何使用本系列教程. 我们的教程已经把板载LED讲完了,但是教会你的不应该只是如何使用LED.你应该已经知 ...
- Docker 学习笔记(一):基础命令
仅为个人查阅使用,要学习 Docker 的话,推荐看这份文档:<Docker - 从入门到实践> P.S. 大多数的 docker container xxx/docker image x ...
- 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)
登录 保存密码 安全 加密 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而我前一段时间正好稍微研究了一下,所以把我知道的告诉大家,节约大家查找资料的时间. 你 ...
- Dockfile文件解析
1. Dockerfile内容基础知识 每条保留字指令都必须为大写字母且后面要跟随至少一个参数 指令按照从上到下,顺序执行 #表示注释 每条指令都会创建一个新的镜像层,并对镜像进行提交 2. Dock ...