Description

在樱花盛开的四月,Muxii 望着满天飘落的樱花,向身旁的 ZZH 问道:

“究竟有多少朵樱花在这个四月飘落?”

ZZH 答道:“樱花飘落的朵数  $s$与时间 $t$ 有如下关系:

$s=\prod_{x=1}^t \prod_{y|x} \frac{y^{d(y)}}{\prod_{z|y}(z+1)^2}$

其中 $d(y)$ 表示 $y$ 的约数个数。”

但作为一个文科生萌新,Muxii 显然无法清楚地知道具体的数目,因此他只好继续向 ZZH 询问这个问题的答案。

由于数量可能很大,所以你只需要替 ZZH 告诉 Muxii 他所需要的答案对 $p$ 取模的结果就好了。

Solution

题中所求为

$$ans=\left(\prod_{x=1}^n\prod_{y|x}\frac{y^{d(y)}}{\prod_{z|y}(z+1)^2}\right)\bmod p$$

大力操作式子:因为

$$y^{d(y)}=\prod_{z|y}y=\prod_{z|y}z\cdot\frac{y}{z}=\prod_{z|y}z^2$$

$$\sum_{z|y,y|n}=d(\frac{n}{z})$$

所以

$$s=\prod_{x=1}^n\prod_{y|x}\frac{y^{d(y)}}{\prod_{z|y}(z+1)^2}=\prod_{x=1}^n\prod_{y|x}\prod_{z|y}\left(\frac{z}{z+1}\right)^2=\prod_{z=1}^n\left(\frac{z}{z+1}\right)^{2sumd(\lfloor\frac{n}{z}\rfloor)}$$

其中$sumd(n)=\sum_{i=1}^n d(i)$

由于要求$d$的前缀和,所以有杜教筛

设$f=d=1*1,g=\mu$,则$f*g=1*1*\mu=1$,可以使用杜教筛,现在需要求出$\mu$的前缀和

再次使用杜教筛即可

求原式的值可以用整除分块做

时间复杂度$\Theta(n^{\frac 23}+\sqrt{n}\log n)$

#include<iostream>
#include<cstdio>
using namespace std;
long long n,mod,pmod,prime[],mu[],minn[],d[],tot,summu[],sumd[],ans=;
bool isprime[],vst[];
inline long long read()
{
long long w=,f=;
char ch=;
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
w=(w<<)+(w<<)+ch-'';
ch=getchar();
}
return w*f;
}
long long Mu(long long x)
{
return x<=?mu[x]:summu[n/x];
}
long long D(long long x)
{
return x<=?d[x]:sumd[n/x];
}
void djs(long long N)
{
if(N<=||vst[n/N])
{
return;
}
vst[n/N]=true;
for(long long l=;l<=N;)
{
long long r=N/(N/l);
djs(N/l);
(summu[n/N]+=(pmod-(r-l+)*Mu(N/l)%pmod)%pmod)%=pmod;
l=r+;
}
(summu[n/N]+=)%=pmod;
for(long long l=;l<=N;)
{
long long r=N/(N/l);
(sumd[n/N]+=pmod-((Mu(r)-Mu(l-)+pmod)%pmod)*D(N/l)%pmod)%=pmod;
l=r+;
}
(sumd[n/N]+=N)%=pmod;
}
long long ksm(long long a,long long p)
{
long long ret=;
while(p)
{
if(p&)
{
(ret*=a)%=mod;
}
(a*=a)%=mod;
p>>=;
}
return ret;
}
int main()
{
n=read();
mod=read();
pmod=mod-;
mu[]=d[]=;
for(long long i=;i<=;i++)
{
if(!isprime[i])
{
prime[++tot]=i;
mu[i]=-;
d[i]=;
minn[i]=;
}
for(long long j=;j<=tot&&i*prime[j]<=;j++)
{
isprime[i*prime[j]]=true;
if(!(i%prime[j]))
{
minn[i*prime[j]]=minn[i]+;
d[i*prime[j]]=d[i]/(minn[i]+)*(minn[i*prime[j]]+);
mu[i*prime[j]]=;
break;
}
minn[i*prime[j]]=;
d[i*prime[j]]=d[i]*d[prime[j]];
mu[i*prime[j]]=mu[i]*-;
}
}
for(long long i=;i<=;i++)
{
(d[i]+=d[i-])%=pmod;
((mu[i]+=mu[i-])+=pmod)%=pmod;
}
djs(n);
for(long long l=;l<=n;)
{
long long r=n/(n/l);
(ans*=ksm(l*ksm(r+,mod-)%mod,D(n/l)))%=mod;
l=r+;
}
(ans*=ans)%=mod;
printf("%lld\n",ans);
return ;
}

四月樱花

最新文章

  1. [调整] Firemonkey iOS 原生 Edit 透明框, 改变框色
  2. 学习mongo系列(四) find().pretty() remove() 查询
  3. Android 属性动画(Property Animation) 完全解析 (上)
  4. 【转】Bresenham快速画直线算法
  5. mybatis 如何查找表里的某一个字段,然后返回它们的结果集list ?
  6. 使用git pull文件时和本地文件冲突怎么办?
  7. hdu 1760 A New Tetris Game 博弈论
  8. locale 详解
  9. 小希的迷宫--hdu1272(并查集)
  10. svn常见问题汇总
  11. 无限树Jquery插件zTree的使用方法
  12. “天龙八步”细说浏览器输入URL后发生了什么
  13. Codeforces 837 简要题解
  14. select实现简单TCP通信(ubuntu 18.04)
  15. Docker OpenvSwitch 介绍 or 工作原理
  16. 纯小白入手 vue3.0 CLI - 3.1 - 路由 ( router )
  17. 关于tomcat不同版本的maxPostSize
  18. 凯撒密码、GDP格式化输出、99乘法表
  19. 洛谷P1679神奇的四次方数--DP
  20. JS如何获取上传标签的文件路径和文件名?

热门文章

  1. PHP date_modify() 函数
  2. Golang | Go语言多态的实现与interface使用
  3. Sharding-JDBC实现读写分离
  4. 笨办法学习python3练习代码:argv参数变量与文件操作
  5. Idea 提交配置说明
  6. 家庭记账本APP开发准备(三)
  7. BiMPM:Bilateral Multi-Perspctive Matching for Natural Language Sentences
  8. JS 弹出框拖拽
  9. javascript 简单、繁杂类型、栈、堆笔记
  10. C#LeetCode刷题之#15-三数之和(3Sum)