PowMod (欧拉推式子 + 指数循环节)
2024-09-14 22:18:58
最主要的步骤是用 1式子和2式子推 3式子。(难点,看了很多博客最后的时候那个式子看不懂)
- 当n, m互质时即gcd(n, m) == 1,存在phi(n * m) = phi(m) * phi(n)
- 当m为素数且n%m == 0时,存在phi(n*m) = phi(n) * m
- 记 为S(n, m),存在S(n,m) = S(n/p, m) * (p – 1) + S(n, m/p) (其中p为素数)
#include<bits/stdc++.h>
#define LL long long
using namespace std; const int MAXN = 1e7 + ;
const int mod = 1e9 + ;
bool check[MAXN];
int phi[MAXN], prime[MAXN], tot;
LL sum[MAXN],now[MAXN]; LL myPow(LL a, int p, LL mod){
LL ret = ;
while(p){
if(p & ) ret = ret * a % mod;
a = a * a % mod;
p >>= ;
}
return ret;
} void phi_and_prime_table(int N) {
memset(check,false,sizeof(check));
phi[] = ;
tot = ;
for(int i = ; i <= N; i++) {
if( !check[i] ) {
prime[tot++] = i;
phi[i] = i - ;
}
for(int j = ; j < tot; j++) {
if(i * prime[j] > N)
break;
check[i * prime[j]] = true;
if( i % prime[j] == ) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
} else {
phi[i * prime[j]] = phi[i] * (prime[j] - );
}
}
}
for(int i = ; i <= N; i ++){
sum[i] = (sum[i - ] + phi[i]) % mod;
}
} LL S(int n, int m){
if( n == ) return sum[m];
if( m == ) return ;
for(int i = ; i < tot && prime[i] <= n; i ++){
if( n % prime[i] == ) {
int p = prime[i];
return (( 1LL * (p - ) * S(n/p, m))%mod + S(n, m/p) % mod ) % mod;
}
}
} LL A(int k,int p){
if(k == ) return ;
if(p == ) return ;
return myPow(k, phi[p] + A(k, phi[p]), p);
} int main() {
phi_and_prime_table();
int n,m,p;
while(~scanf("%d%d%d",&n,&m,&p)){
int k = S(n,m);
printf("%lld\n",A(k, p));
}
return ;
}
最新文章
- UWP简单示例(二):快速开始你的3D编程
- 破解Outlook数据文件密码/PST访问密码
- 改变placeholder颜色
- Asset Store
- linux日志处理logrotate使用
- main函数的argc和argv
- (转)从Membership 到 .NET4.5 之 ASP.NET Identity
- MySQL(3):数据库操作
- js比较两个日期大小
- css设置滚动条颜色与样式以及如何去掉与隐藏滚动条
- C++待解
- Selenium1 Selenium2 WebDriver
- java 中 “文件” 和 “流” 的简单分析
- php+中文分词scws+sphinx+mysql打造千万级数据全文搜索
- restful架构风格设计准则(一)以资源为中心、自描述的请求响应、资源状态迁移为粒度
- python 去掉重复元素 学到再添加
- http://zaojiasys.jianshe99.com 建造师数据泄漏,可以查看全部所有人的信息!
- 关于使用vw单位适配H5项目(二)
- HttpServletRequest解决中文乱码的问题
- JUC线程池之 ThreadPoolExecutor简介