题面传送门

题意:

\[\prod\limits_{x=1}^n\prod\limits_{y|x}\frac{y^{d(y)}}{\prod\limits_{z|y}z+1} \pmod{p}
\]

\(1 \leq n \leq 10^9\)

\[y^{d(y)}=\prod_{z|y}y=\prod\limits_{z|y}z\times\frac{y}{z}=\prod\limits_{z|y}z^2
\]

然后

\[\begin{aligned}ans&=\prod\limits_{x=1}^n\prod\limits_{y|x}\frac{y^{d(y)}}{\prod\limits_{z|y}z+1}\\&=\prod\limits_{x=1}^n\prod\limits_{y|x}\prod\limits_{z|y}(\frac{z}{z+1})^2\\&=\prod_{z=1}^n(\frac{z}{z+1})^{2\times\sum\limits_{xyz \leq n}1}\\&=\prod_{z=1}^n(\frac{z}{z+1})^{2\times\sum\limits_{y \leq \frac{n}{z}}\lfloor\frac{n}{yz}\rfloor}\end{aligned}
\]

令 \(f(i)=\sum\limits_{i=1}^n\lfloor\frac{n}{i}\rfloor\),那么 \(ans=\prod_{z=1}^n(\frac{z}{z+1})^{2\times f(\lfloor\frac{n}{z}\rfloor)}\)。

\(f(i)\) 显然可以用整除分块来搞。我们发现外面枚举 \(z\) 的部分也可以使用整除分块,因此可以想到整除分块套整除分块,时间复杂度 \(\mathcal O(n^{\frac{3}{4}})\)

借鉴杜教筛的优化方法,可以预处理出 \([1,n^{\frac{2}{3}}]\) 的 \(f(i)\),这样总时间复杂度就变为 \(\mathcal O(n^{\frac{2}{3}})\)

/*
Contest: -
Problem: P6788
Author: tzc_wk
Time: 2020.9.19
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define y1 y1010101010101
#define y0 y0101010101010
#define int long long
typedef pair<int,int> pii;
typedef long long ll;
inline int read(){
int x=0,neg=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') neg=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*neg;
}
int n=read(),mod=read();
inline int qpow(int x,int e){
x%=mod;int ans=1;
while(e){
if(e&1) ans=ans*x%mod;
x=x*x%mod;e>>=1;
}
return ans;
}
int f[1000005];
inline int calc(int x){
if(x<=1000000) return f[x];
int sum=0;
for(int l=1,r;l<=x;l=r+1){
r=x/(x/l);
sum=(sum+(x/l)%(mod-1)*(r-l+1)%(mod-1))%(mod-1);
}
return sum;
}
inline void prework(int m){
fz(i,1,m) for(int j=i;j<=m;j+=i) f[j]++;
fz(i,1,m) f[i]=(f[i]+f[i-1])%(mod-1);
}
signed main(){
prework(1000000);int ans=1;
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
int xx=qpow((r+1)%mod,mod-2)*(l%mod)%mod;xx=xx*xx%mod;
ans=ans*qpow(xx,calc(n/l))%mod;
}
printf("%lld\n",ans);
return 0;
}

最新文章

  1. Python学习教程(learning Python)--2.3.4Python函数返回值
  2. 33条C#、.Net经典面试题目及答案[zt]
  3. [原]Hadoop海量视频、图像分析分布式处理总结
  4. vs2013 创建网站
  5. QF——iOS中数据持久化的几种方式
  6. ThinkPHP第九天(在Admin分组中配置__PUBLIC__,$POST异步传输,import使用方法,验证码点击刷新方法,Create方法作用)
  7. CF615D Multipliers [数学]
  8. Linux基础教程
  9. 你是如何自学 Python 的?
  10. tomcat连接池配置和使用
  11. 知识小罐头04(idea+maven+部署war包到tomcat 下)
  12. 怎么给easyui中的datagrid加水平滚动条
  13. Error creating bean
  14. 前端使用Mock服务Json-server
  15. Openstack-Ceilometer-Alarm运行机制
  16. HDU2643(SummerTrainingDay05-P 第二类斯特林数)
  17. webuploader传递参数
  18. 探索ORM ————iBati(一)
  19. Mysql索引详解及优化(key和index区别)
  20. if __name__ == &#39;__main__&#39;的作用和原理

热门文章

  1. 【UE4 设计模式】状态模式 State Pattern
  2. RabbitMQ:从入门到搞定面试官
  3. [技术博客]在团队中使用Pull Request来管理代码
  4. OO_JAVA_JML系列作业_单元总结
  5. stm32看门狗详细解答,看了觉得一下子明白了很多
  6. 编译内核错误:Can&#39;t use &#39;defined(@array)&#39; (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373
  7. single-number leetcode C++
  8. linux 内核源代码情景分析——地址映射的全过程
  9. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序
  10. RedHat 7.0 下 FTP 服务的安装,启动,配置,以及虚拟用户的建立