太慢了!太慢了!我的替身 【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:我麻烦了,不需要使用杜教筛,小部分线性筛大部分整除分块即可。其他的好像都没这个快。

#include<cstdio>
#include<cmath>
typedef unsigned ui;
typedef unsigned long long ull;
const int M=2e6;
ui n,mod,lim,top,pri[149000],idx[M+5],d[M+5];
double inv[200005];
inline ui Pow(ui a,ui b=mod-2){
ui ans(1);
for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;
return ans;
}
inline void sieve(const ui&M){
register ui i,j,x;d[1]=1;
for(i=2;i<=M;++i){
if(!d[i])pri[++top]=i,d[i]=2,idx[i]=1;
for(j=1;j<=top&&(x=i*pri[j])<=M;++j){
if(!(i%pri[j])){
idx[x]=idx[i]+1;d[x]=((ui)(d[i]*inv[idx[x]]))*(idx[x]+1);break;
}
idx[x]=1;d[x]=d[i]*2;
}
}
for(i=1;i<=M;++i)d[i]+=d[i-1];
}
inline ui GetSd(const ui&n){
if(n<=lim)return d[n];
ull ans(0);ui i;
for(i=1;i*i<=n;++i)ans+=n*inv[i];
return ((ans<<1)-(i-1)*(i-1))%(mod-1);
}
signed main(){
register ui i,x,L,R,ans=1;
scanf("%u%u",&n,&mod);
for(i=1;(i-1)*(i-1)<=n;++i)inv[i]=1./i+1e-15;sieve(lim=ceil(pow(n,2./3)));
for(L=1;L*L<=n;++L)ans=1ull*ans*Pow(1ull*L*Pow(L+1)%mod,GetSd(n*inv[L]))%mod;
for(x=n*inv[L];L<=n;L=R+1){
if(x*L>n)--x;R=n*inv[x];
ans=1ull*ans*Pow(1ull*L*Pow(R+1)%mod,GetSd(x))%mod;
}
printf("%u",1ull*ans*ans%mod);
}

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. java中Statement 对象

    1.创建Statement对象建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句.Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段 ...

  2. 交换机基本原理与VRP基础及操作

    交换机基本原理与VRP基础及操作 目录 交换机基本原理与VRP基础及操作 一.数据链路层 1.数据链路层的位置 2.数据链路层的功能 二.以太网(Ethernet) 1.以太网的概念 2.MAC地址( ...

  3. LeetCode随缘刷题之Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成

    今天给大家分享一个Java经典的面试题,题目是这样的: 本题是LeetCode题库中的49题. 将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 举个例子:输入["eat&qu ...

  4. python多版本切换

    环境:Macbook MacOS自带的python2.7,在命令行中输入python后会显示2.7版本 如何切换成新版本? 一.修改用户配置环境变量~/.bash_profile 确定新版本的安装位置 ...

  5. Android SugarORM(1)

    Android Sugar ORM (1) Android Sugar ORM比我之前用过的ORM都要简单许多, 其目的是简化与Android中SQLite数据库的交互, 优点如下: 消除了编写SQL ...

  6. C# 中的Stream流

    流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供: 流其实是一种信息的转换,是有序的,有输入和输出流(IO); 1.FileStream 文件流,读取和保存文件操作使用: //写 ...

  7. Burp intruder暴力攻击web口令

    实验目的 利用Burp intruder功能爆破出后台登陆密码admin. 实验原理 1)Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫 ...

  8. Wireshark教程之数据包操作

    实验目的 1.工具介绍 2.主要应用 实验原理 1.网络管理员用来解决网络问题 2.网络安全工程师用来检测安全隐患 3.开发人员用来测试执行情况 4.学习网络协议 实验内容 1.工具基本使用 2.快速 ...

  9. IP欺骗实验

    实验目的 1.掌握IP欺骗的原理 2.学会利用IPSpoof软件工具进行伪造源IP地址的IP欺骗. 实验内容 使用IPSpoof进行本机IP地址修改,与目标主机通信,进行IP欺骗实验 实验环境描述 1 ...

  10. Centos7使用kubeadm安装1.23.1版本的k8s集群

    系统环境 #cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #Linux内核一定要大约等于3.10,也就是centos版本要大 ...