太慢了!太慢了!我的替身 【The World】 是最强的替身!

\(O(n^{\frac 2 3})\) 的解法!不清楚用 sbt 能不能更快一些,可能会吧。灵感来源于BZOJ4176,同时也可看到我也是 BZOJ4176 的最优解。理所当然地,我也是 P6788 的最优解

首先看着这个柿子:

\[\prod_{i=1}^n\prod_{d|i}\frac {d^{\sigma_0(d)}} {\prod_{k|d} (k+1)^2}
\]

考虑将 \(d^{\sigma_0(d)}\) 展开:

\[\prod_{i=1}^n\prod_{d|i}\frac {\prod_{k|d}d} {\prod_{k|d}(k+1)^2}
\]

设 \(kx=d\):

\[\prod_{i=1}^n\prod_{d|i}\prod_{k|d}\frac {kx} {(k+1)^2}
\]

容易发现 \(\prod_{k|d}k \times (\frac d k)=\prod_{k|d} k \times \prod_{k|d}k=(\prod_{k|d}k)^2\)

所以:

\[(\prod_{i=1}^n\prod_{d|i}\prod_{k|d}\frac k {k+1})^2
\]
\[(\prod_{k=1}^n(\frac k {k+1})^{\prod_{i=1}^{\lfloor \frac n k \rfloor}\lfloor \frac n {ki} \rfloor})^2
\]

大多数同学是使用整除分块暴力计算 \(\sum_{i=1}^n \lfloor \frac n i \rfloor\) 而达到 \(O(n^{\frac 3 4})\) 的复杂度,但是这玩意儿其实有性质。

\[\sum_{i=1}^n\sigma_0(i) = \sum_{i=1}^n \sum_{d|i}1 = \sum_{d=1}^n \lfloor \frac n d \rfloor
\]

所以这玩意儿相当于求 \(\sigma_0\) 的块筛。求块筛的常见做法是使用杜教筛或挖掘性质,这里考虑杜教筛。

因为 \(\sigma_0 = 1 * 1\),所以考虑配对一个 \(\mu\) 上去,使其变为 \(1\)。

只需要同时筛 \(mu\) 和 \(\sigma_0\) 即可。

没有必要对 \(n^{\frac 2 3}\) 以下的 \(\sigma_0\) 使用整除分块计算前缀和,因为在筛 \(\mu\) 的同时把 \(\sigma_0\) 也筛了,这样反而会增加常数。同样也没有必要使用 sbt。

upd:我麻烦了,不需要使用杜教筛,小部分线性筛大部分整除分块即可。其他的好像都没这个快。

  1. #include<cstdio>
  2. #include<cmath>
  3. typedef unsigned ui;
  4. typedef unsigned long long ull;
  5. const int M=2e6;
  6. ui n,mod,lim,top,pri[149000],idx[M+5],d[M+5];
  7. double inv[200005];
  8. inline ui Pow(ui a,ui b=mod-2){
  9. ui ans(1);
  10. for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;
  11. return ans;
  12. }
  13. inline void sieve(const ui&M){
  14. register ui i,j,x;d[1]=1;
  15. for(i=2;i<=M;++i){
  16. if(!d[i])pri[++top]=i,d[i]=2,idx[i]=1;
  17. for(j=1;j<=top&&(x=i*pri[j])<=M;++j){
  18. if(!(i%pri[j])){
  19. idx[x]=idx[i]+1;d[x]=((ui)(d[i]*inv[idx[x]]))*(idx[x]+1);break;
  20. }
  21. idx[x]=1;d[x]=d[i]*2;
  22. }
  23. }
  24. for(i=1;i<=M;++i)d[i]+=d[i-1];
  25. }
  26. inline ui GetSd(const ui&n){
  27. if(n<=lim)return d[n];
  28. ull ans(0);ui i;
  29. for(i=1;i*i<=n;++i)ans+=n*inv[i];
  30. return ((ans<<1)-(i-1)*(i-1))%(mod-1);
  31. }
  32. signed main(){
  33. register ui i,x,L,R,ans=1;
  34. scanf("%u%u",&n,&mod);
  35. for(i=1;(i-1)*(i-1)<=n;++i)inv[i]=1./i+1e-15;sieve(lim=ceil(pow(n,2./3)));
  36. for(L=1;L*L<=n;++L)ans=1ull*ans*Pow(1ull*L*Pow(L+1)%mod,GetSd(n*inv[L]))%mod;
  37. for(x=n*inv[L];L<=n;L=R+1){
  38. if(x*L>n)--x;R=n*inv[x];
  39. ans=1ull*ans*Pow(1ull*L*Pow(R+1)%mod,GetSd(x))%mod;
  40. }
  41. printf("%u",1ull*ans*ans%mod);
  42. }

LGP6788题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 诗和远方-target

    学习也是这样:不以结婚为目的的谈恋爱,都是耍流氓!

  2. laravel 依赖注入 接口设计

    假设我现在需要做一个支付服务,那么我先设计一个接口 interface PayInterface{ public function pay(Order $order) : string; } 然后实现 ...

  3. Struts2中的过滤器

    过滤器:            过滤器可以处理用户的请求和程序响应的内容,可用于权限控制.编码转换的场合.过滤器是servlet规范中的一部分,不是只有Struts2有. 使用过滤器之前你得定义一个过 ...

  4. iOS App程序内多语言国际化实现 By HL

    iOS 多语言设置有很多方式可以实现,之前在做手机思埠1.0时,就对app进行了多语言设置,当时看到很多方法,比如用plist等方式保存键值对的,不过还是用Localisator来国际化最方便 1.添 ...

  5. netty系列之:JVM中的Reference count原来netty中也有

    目录 简介 ByteBuf和ReferenceCounted ByteBuf的基本使用 ByteBuf的回收 ByteBuf的衍生方法 ChannelHandler中的引用计数 内存泄露 总结 简介 ...

  6. 基于ASP.NET Core 5.0使用RabbitMQ消息队列实现事件总线(EventBus)

    文章阅读请前先参考看一下 https://www.cnblogs.com/hudean/p/13858285.html 安装RabbitMQ消息队列软件与了解C#中如何使用RabbitMQ 和 htt ...

  7. Solution -「LOCAL」Drainage System

    \(\mathcal{Description}\)   合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...

  8. C#操作读写INI配置文件

    一个完整的INI文件格式由节(section).键(key).值(value)组成.示例如:[section]key1=value1key2=value2; 备注:value的值不要太长,理论上最多不 ...

  9. CPU优化之平均负载率之辅助工具

    前面介绍了平均负载均衡的一些内容,那实际应用中如何查看,分析性能瓶颈呢?下面介绍相关的辅助工具. 一.stress stress是Linux 系统压力测试工具,其通过异常进程模拟平均负载升高的场景(前 ...

  10. Spring Boot部署之jar包运行

    上篇阐述了Spring Boot war部署项目,本篇阐述另一种运行方式:jar包运行. 一.打jar包 1.修改pom.xml配置 2.执行package(对于module执行package之前需要 ...