题意

给你n(n≤109)n(n\leq 10^9)n(n≤109),m(m≤2×109)m(m\leq 2\times10^9)m(m≤2×109),p(p≤2×109)p(p\leq 2\times10^9 )p(p≤2×109),ppp为质数求
∏i=1n∏j=1n∏k=1nmgcd(i,j)[k∣gcd(i,j)]\prod_{i=1}^n\prod_{j=1}^n\prod_{k=1}^nm^{gcd(i,j)[k|gcd(i,j)]}i=1∏n​j=1∏n​k=1∏n​mgcd(i,j)[k∣gcd(i,j)]
模ppp的答案

思路

我们先只考虑指数部分和欧拉降幂那么有
∑i=1n∑j=1n∑k=1ngcd(i,j)[k∣gcd(i,j)]modp−1\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^ngcd(i,j)[k|gcd(i,j)]\ mod\ p-1i=1∑n​j=1∑n​k=1∑n​gcd(i,j)[k∣gcd(i,j)] mod p−1
可以认为∑k=1ngcd(i,j)[k∣gcd(i,j)]\sum_{k=1}^ngcd(i,j)[k|gcd(i,j)]k=1∑n​gcd(i,j)[k∣gcd(i,j)]
计算的是gcd(i,j)∗gcd(i,j)的约数个数gcd(i,j)*gcd(i,j)的约数个数gcd(i,j)∗gcd(i,j)的约数个数,我们用σ(d)\sigma (d)σ(d)表示ddd的约数个数
那么原式就等于
∑i=1n∑j=1ngcd(i,j)σ(gcd(i,j))\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\sigma(gcd(i,j))i=1∑n​j=1∑n​gcd(i,j)σ(gcd(i,j))
令d=gcd(i,j)d=gcd(i,j)d=gcd(i,j)得
∑d=1ndσ(d)∑i=1n∑j=1n[gcd(i,j)==d]\sum_{d=1}^nd\sigma(d)\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)==d]d=1∑n​dσ(d)i=1∑n​j=1∑n​[gcd(i,j)==d]

∑d=1ndσ(d)∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)==1]\sum_{d=1}^nd\sigma(d)\sum_{i=1}^{\left \lfloor\frac{n}{d}\right \rfloor}\sum_{j=1}^{\left \lfloor\frac{n}{d}\right \rfloor}[gcd(i,j)==1]d=1∑n​dσ(d)i=1∑⌊dn​⌋​j=1∑⌊dn​⌋​[gcd(i,j)==1]
考虑后面的部分
∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)==1]\sum_{i=1}^{\left \lfloor\frac{n}{d}\right \rfloor}\sum_{j=1}^{\left \lfloor\frac{n}{d}\right \rfloor}[gcd(i,j)==1]i=1∑⌊dn​⌋​j=1∑⌊dn​⌋​[gcd(i,j)==1]
可以用莫比乌斯反演做但是这恰好iii和jjj的上限都nnn,可以认为是1−n1-n1−n中互质的数对数,考虑每个iii的贡献其实就是φ(i)\varphi(i)φ(i)欧拉函数的值,那么答案就是欧拉函数的前缀和,但是由于iii,jjj的顺序是有影响的然后(1,1)(1,1)(1,1)只计算一次所以有
∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)==1]=2∗Φ(⌊nd⌋)−1\sum_{i=1}^{\left \lfloor\frac{n}{d}\right \rfloor}\sum_{j=1}^{\left \lfloor\frac{n}{d}\right \rfloor}[gcd(i,j)==1]=2*\Phi(\left \lfloor\frac{n}{d}\right \rfloor)-1i=1∑⌊dn​⌋​j=1∑⌊dn​⌋​[gcd(i,j)==1]=2∗Φ(⌊dn​⌋)−1
其中Φ\PhiΦ为欧拉函数的和函数
那么原式就转化为
=∑d=1ndσ(d)(2∗Φ(⌊nd⌋)−1)=\sum_{d=1}^nd\sigma(d)(2*\Phi(\left \lfloor\frac{n}{d}\right \rfloor)-1)=d=1∑n​dσ(d)(2∗Φ(⌊dn​⌋)−1)
然后我们再考虑一下
∑i=1niσ(i)\sum_{i=1}^ni\sigma(i)i=1∑n​iσ(i)
这个求和
可以把约数函数展开来
=∑i=1ni∑d∣i1=\sum_{i=1}^ni\sum_{d|i}1=i=1∑n​id∣i∑​1
那么表示的就是对于每一个iii枚举他的因子有哪些,已知在1−n1-n1−n中枚举iii的因子和枚举iii的倍数是等价的那么就有
=∑d=1n∑d∣ii=\sum_{d=1}^n\sum_{d|i}i=d=1∑n​d∣i∑​i
iii为ddd的倍数,我们再把后面的展开来
=∑d=1n(d+2d+3d+⋯+⌊nd⌋d)=\sum_{d=1}^n(d+2d+3d+\cdots+\left \lfloor\frac{n}{d}\right \rfloor d)=d=1∑n​(d+2d+3d+⋯+⌊dn​⌋d)
后面就是一个等差数列
=∑d=1nd⌊nd⌋(⌊nd⌋+1)2=\sum_{d=1}^nd\frac{\left \lfloor\frac{n}{d}\right \rfloor(\left \lfloor\frac{n}{d}\right \rfloor+1)}{2}=d=1∑n​d2⌊dn​⌋(⌊dn​⌋+1)​
令Id(n)=∑i=1niσ(i)Id(n)=\sum_{i=1}^ni\sigma(i)Id(n)=i=1∑n​iσ(i)
原式想用分块优化的话那么有last=nnilast=\frac{n}{\frac{n}{i}}last=in​n​有

=∑i=last+1n(Id(last)−Id(i−1))(2∗Φ(⌊ni⌋)−1)=\sum_{i=last+1}^n(Id(last)-Id(i-1))(2*\Phi(\left \lfloor\frac{n}{i}\right \rfloor)-1)=i=last+1∑n​(Id(last)−Id(i−1))(2∗Φ(⌊in​⌋)−1)
Id(n)Id(n)Id(n)可以用线性筛处理一部分(先求每个数的约数个数再求前缀和的时候乘以i),大于的部分就用上面求的分块来处理了,欧拉函数求和用杜教筛即可
求完这个后最后的答案求一个快速幂就可以了,尽量都用int,不然会超时

#include<bits/stdc++.h>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int N=10000005;
int mod;
unordered_map<int,int> P;
unordered_map<int,int> D;
bool isP[N];
int prime[N];
int cnt;
int phi[N];
int d[N];
int num[N];
long long inv=500000004;
void init()
{phi[1]=d[1]=1;for(int i=2; i<N; i++){if(!isP[i]){prime[cnt++]=i;phi[i]=i-1;d[i]=2;num[i]=1;}for(int j=0; j<cnt&&(ll)i*prime[j]<N; j++){isP[i*prime[j]]=true;if(i%prime[j]){phi[i*prime[j]]=phi[i]*(prime[j]-1);d[i*prime[j]]=d[i]*d[prime[j]];num[i*prime[j]]=1;}else{phi[i*prime[j]]=phi[i]*prime[j];num[i*prime[j]]=num[i]+1;d[i*prime[j]]=d[i]/(num[i]+1)*(num[i*prime[j]]+1);break;}}}for(int i=1; i<N; i++){phi[i]=(phi[i]+phi[i-1])%mod;d[i]=((ll)i*d[i]+d[i-1])%mod;}
}
int Sum(int x)
{if(x<N)return phi[x];if(P[x])return P[x];int ans=(x+1ll)*x/2%mod;for(int i=2,last; i<=x; i=last+1){last=x/(x/i);ans=(ans-(last-i+1ll)*Sum(x/i)%mod+mod)%mod;}ans=((ll)ans+mod)%mod;P[x]=ans;return ans;
}
int Id(int n)
{if(n<N) return d[n];else if(D[n]) return D[n];int ans=0;for(int i=1,last; i<=n; i=last+1){last=n/(n/i);ans=(ans+(last+i)*(last-i+1ll)/2%mod*((n/i*(n/i+1ll)/2)%mod)%mod)%mod;}D[n]=ans;return ans;
}
long long quickmod(long long a,long long b,long long p)
{long long ans=1;while(b){if(b%2==1)ans=ans*a%p;a=a*a%p;b=b/2;}return ans;
}
int main()
{int n,m,p;scanf("%d%d%d",&n,&m,&p);mod=p-1;init();int ans=0;for(int i=1,last; i<=n; i=last+1){last=n/(n/i);ans=(ans+(Id(last)-Id(i-1)+mod)%mod*((2ll*Sum(n/i)%mod-1ll+mod)%mod)%mod+mod)%mod;}printf("%lld\n",quickmod(m,ans,p));return 0;
}
/*
1000000000 999999997 98765431
*/

The 2019 ACM-ICPC China Shannxi Provincial Programming Contest B. Product(杜教筛+约数)相关推荐

  1. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Tasks AC的C++语言程序: /* JSK-39268 Tasks */#include <bits/stdc++.h ...

  2. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest

    原题链接:https://www.jisuanke.com/contest/2625?view=challenges A. Tasks #include<bits/stdc++.h> us ...

  3. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest C.Angel's Journey(计算几何基础)

    题目 T(T<=500)组样例,每组样例给出rx,ry,r,x,y(-100<=rx,ry,x,y<=100,0<r<=100) 代表被救的人在(rx,ry-r)位置,且 ...

  4. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest J.And And And(启发式合并)

    题目 n(n<=1e5)个点的树,是一棵点1为根的有根树, 每条边有一边权w(0<=w<=1e18) 简化题意,如果u<v,且树上(u,v)之间的边权异或和为0, 则如果把(u ...

  5. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest( J. And And And)

    J题 题解:该题有好多种做法,我的比较low,因为正向的去推是不可行的,我们可以反向考虑每一条边权异或值为0的路径所产生的贡献,我们先把整棵树的根节点固定为1,然后我们可以考虑将满足条件的路径再细分为 ...

  6. E. Tree(The 2019 ACM-ICPC China Shannxi Provincial Programming Contest)(树链剖分+线段树)

    4000ms 262144K judge:计蒜客 Description Ming and Hong are playing a simple game called nim game. They h ...

  7. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest C.Angel's Journey

    题意: T(T<=500)组样例,每组样例给出rx,ry,r,x,y(-100<=rx,ry,x,y<=100,0<r<=100) 代表被救的人在(rx,ry-r)位置, ...

  8. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest (西安邀请赛重现) J. And And And...

    链接:https://nanti.jisuanke.com/t/39277 思路: 一开始看着很像树分治,就用树分治写了下,发现因为异或操作的特殊性,我们是可以优化树分治中的容斥操作的,不合理的情况只 ...

  9. The 2019 ACM-ICPC China Shannxi Provincial Programming Contest-L.Swap

    https://nanti.jisuanke.com/t/39279 题意:给一个数组操作1:前后部分调换(n为偶数中间的不变):操作2: 偶数位置与前面位置的交换(n为奇数最后一个不变) 思路:打表 ...

  10. 2019年CCPC - 网络赛E:huntian oy【杜教筛】

    题目: HDU---6706:huntian oy 题意: 给定N,a,b,求下面式子的值(求和后再mod 1e9+7): 分析: 一直怯于杜教筛不敢去学习[一看就会的杜教筛],今天终于迈出了这一步, ...

最新文章

  1. 第十三周学习进度情况
  2. 装了BT5后要做的几件事
  3. 在Windows上启用LDAPs
  4. 显卡欺骗器状态检测及安装注意事项
  5. PostgreSQL DISTINCT用法
  6. python no module named pandas_【原创】大叔经验分享(11)python引入模块报错ImportError: No module named pandas numpy...
  7. [实变函数]5.6 Lebesgue 积分的几何意义 $\bullet$ Fubini 定理
  8. Linux常用文件拷贝方式:scp,rsync,expect
  9. LINQ to SQL的不足
  10. 如何导出无水印_抖音视频怎么去水印 抖音怎么导出无水印视频
  11. 千亿级数量下日志分析系统的技术架构选型
  12. 413.等差数列划分(力扣leetcode) 博主可答疑该问题
  13. perl语言 入门(转)
  14. 通过u盘启动计算机使用ghost安装系统步骤,详细教您如何使用u盘启动盘手动ghost备份系统...
  15. (上)苹果有开源,但又怎样呢?
  16. Android开发——网络请求(一)网络请求的API、授权和方法
  17. 手机必备应用:狐猴浏览器,一站式开启浏览器的所有用法
  18. 平均工资发布,IT 业超 13 万元居首;Def Con 黑客大会首次在中国举办
  19. MVC实现SQL多表查询并导出表格
  20. 购买计算机的作文英语,关于买电脑的英语作文

热门文章

  1. Android 获取/设置:窝蜂移动数据网络状态
  2. WINDOWS中hosts文件位置
  3. 2019.2.18 模板的创建和自定义子模板文件(single.php 等)
  4. BEEF的搭建与使用
  5. Not authorized , ReasonPhrase:Unauthorized
  6. 计算机字长 按字编址,按字节编址与按字长编址区别及原理图解分析
  7. 按字节编址、按字编址、按字节寻址、按字寻址。
  8. 输入经纬度在地图中标注位置(百度地图)
  9. 如何快速构建千人规模的数字化研发管理系统
  10. ros 控制xbox_从提示框:在Windows中控制Xbox控制器,在夏天保持计算机凉爽以及DIY图书扫描装置...