HDU 5728 - PowMod
HDU 5728 - PowMod
题意:
定义: k = ∑(i=1,m) φ(i∗n) mod 1000000007
给出: n,m,p ,且 n 无平方因子
求: ans= k^(k^(k...k)) mod p (k有无限个)
分析:
欧拉函数 + 指数循环节
第一部分 求出 k.
定理: 1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1.
应用:
∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数) ,可自行推导
第二部分
应用指数循环节化无限为有限,具体实现为递归操作
指数循环节: A^x = A^(x % φ(C) + φ(C)) (mod C) (x >= φ(C))
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MOD= ;
const int MAXN=1e7;
int euler[MAXN+];
long long sum[MAXN+];
long long k,n,m,p;
void GetEuler()
{
memset(euler,,sizeof(euler));
euler[]=;
for(int i = ;i <= MAXN;i++)
if(!euler[i])
for(int j = i;j <= MAXN;j += i)
{
if(!euler[j]) euler[j]=j;
euler[j] = euler[j] / i * (i-);
}
sum[]=;
for(int i = ;i <=MAXN; i++)
sum[i] = (sum[i-] + euler[i]) % MOD;
}
long long Get_K(long long n,long long m)
{
if(m==) return ;
if(m==) return euler[n];
if(n==) return sum[m];
if(euler[n]==n-) return (euler[n]*Get_K(,m)%MOD + Get_K(n,m/n))%MOD;
for(int i=;i<MAXN;i++)
if(n%i==)
return (euler[i] * Get_K(n/i,m)%MOD + Get_K(n,m/i) ) % MOD;
}
long long PowMod(long long a,long long b, long long mod)
{
long long r = ;
while(b)
{
if(b&) r = (r*a)%mod;
a= (a*a)%mod;
b>>=;
}
return r;
}
long long Cal(long long k, long long p)
{
if( p == ) return k&;//mod φ(p)
return PowMod(k,Cal(k,euler[p])+euler[p],p);//递归的计算ans,递归出口为φ(p)=1
}
int main()
{
GetEuler();
while(~scanf("%lld%lld%lld",&n,&m,&p))
{
k = Get_K(n,m);
printf("%lld\n",Cal(k,p));
}
}
/*
欧拉函数:
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。 例如euler(8)=4,因为1,3,5,7均和8互质。 通式:
对于一个正整数N的素数幂分解 N = (P1^q1) * (P2^q2) * ...* (Pn^qn).
φ(1) = 1.
φ(N) = N * (1-1/P1) * (1-1/P2) *...* (1-1/Pn). 定理:
1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1. 2.一个数的所有质因子之和是 euler(n)*n/2. 3.若n是素数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质. 特殊性质:
1.当n为奇数时,φ(2n) = φ(n).
2.对于质数p,φ(p) = p - 1
3.除了N=2,φ(N)都是偶数. 指数循环节:
A^x = A^(x % φ(C) + φ(C)) (mod C) (x >= φ(C)) 定理1 应用:
∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数) */
HDU 5728 - PowMod的更多相关文章
- 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. φ ...
- HDU 5278 PowMod 数论公式推导
题意:中文题自己看吧 分析:这题分两步 第一步:利用已知公式求出k: 第二步:求出k然后使用欧拉降幂公式即可,欧拉降幂公式不需要互质(第二步就是BZOJ3884原题了) 求k的话就需要构造了(引入官方 ...
- 徐州赛区网络预赛 D Easy Math
比赛快结束的适合看了一下D题,发现跟前几天刚刚做过的HDU 5728 PowMod几乎一模一样,当时特兴奋,结果一直到比赛结束都一直WA.回来仔细一琢磨才发现,PowMod这道题保证了n不含平方因子, ...
- HDU 4059 容斥原理+快速幂+逆元
E - The Boss on Mars Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- HDU 5793 - A Boring Question
HDU 5793 - A Boring Question题意: 计算 ( ∑(0≤K1,K2...Km≤n )∏(1≤j<m) C[Kj, Kj+1] ) % 1000000007=? (C[ ...
- HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4633 典型的Polya定理: 思路:根据Burnside引理,等价类个数等于所有的置换群中的不动点的个 ...
- HDU 6187 Destroy Walls (思维,最大生成树)
HDU 6187 Destroy Walls (思维,最大生成树) Destroy Walls *Time Limit: 8000/4000 MS (Java/Others) Memory Limit ...
- HDU 6143 - Killer Names | 2017 Multi-University Training Contest 8
/* HDU 6143 - Killer Names [ DP ] | 2017 Multi-University Training Contest 8 题意: m个字母组成两个长为n的序列,两序列中 ...
- HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5
思路和任意模数FFT模板都来自 这里 看了一晚上那篇<再探快速傅里叶变换>还是懵得不行,可能水平还没到- - 只能先存个模板了,这题单模数NTT跑了5.9s,没敢写三模数NTT,可能姿势太 ...
随机推荐
- 一个项目涉及到的50个Sql语句(整理版)
/* 标题:一个项目涉及到的50个Sql语句(整理版) 说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句. */ --1.学生表Student(S,Sname,Sage,Sse ...
- java合并list
import java.util.ArrayList; import java.util.List; import com.google.common.collect.Lists; priva ...
- Python学习笔记4(函数与模块)
1.Python程序的结构 Python的程序由包(package).模块(module)和函数组成. 模块是处理一类问题的集合,由函数和类组成. 包是由一系列模块组成的集合.包是一个完成特定任务的工 ...
- windows 下查看端口占用命令
cmd netstat -ano
- node.js 环境搭建
一 官网下载安装包 : 1.http://www.nodejs.org/download/ 选择相应的包进行安装 2.安装express : npm install -g express -gener ...
- collections——高性能容器数据类型
由于最近对机器学习算法感兴趣,一直知道python有一个包collections封装了一些比dict,list之类高级点的类,所以抽空研究下,为接下来的工作准备. 主要参考是https://docs. ...
- mysql trigger 权限的说明
普通用户在创建trigger时会遇到的问题: 1.如果开启了二进制日志,但是用户没有supper 权限:那么他在创建trigger 时会提示设置log_bin_trust_function_creat ...
- C++----练习
1.完成一个C++实现的加法程序: #include<iostream> int main() { std::cout<<"可以输入两个加数,本程序完成加法...&q ...
- Tomcat学习—Tomcat的简介和目录以及配置文件介绍(Windows环境)
tomcat学习(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天学习TOMCAT,主要学习的是Tomcat的目录结构,配置文件! 1:Tomcat简介 Tomcat 服务器是一个免费 ...
- 像asp.net Mvc一样开发nodejs+express Mvc站点
像asp.net Mvc一样开发nodejs+express Mvc站点 首先,我是个c#码农.从事Mvc开发已然4个年头了,这两年前端MVC的兴起,我也跟风学了一些,对前端的框架也了解一些,angu ...