原题链接

庆祝!第二道数论紫题。

推式子真是太有趣了!

\[\prod_{i=1}^n \prod_{j=1}^n \frac{\operatorname{lcm}(i,j)}{\gcd(i,j)}
\]

\[= \prod_{i=1}^n \prod_{j=1}^n \frac{i \times j}{(\gcd(i,j))^2}
\]

\[= ( \prod_{i=1}^n \prod_{j=1}^n i \times j ) \times ( \prod_{i=1}^n \prod_{j=1}^n \frac{1}{(\gcd(i,j))^2})
\]

先看前面的式子:

\[= ( \prod_{i=1}^n \prod_{j=1}^n i \times j)
\]

\[= ( \prod_{i=1}^n i )^{2 \times n}
\]

\[= (n!)^{2 \times n}
\]

再看后面的式子:(先抛开 \(-2\) 次方,最后再说)

\[= \prod_{d=1}^n \prod_{i=1}^n \prod_{j=1}^n [\gcd(i,j) == d]
\]

\[= \prod_{d=1}^n d^{\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} [\gcd(i,j) == 1]}
\]

先看指数:

\[\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} [\gcd(i,j) == 1]
\]

\[= 2 \times (\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \phi_i) - 1
\]

(这步的依据参照 洛谷 P2568 GCD

显然这个东西,用 欧拉筛前缀和 就可以搞定!

用 \(f_i\) 表示 \(phi_i\) 的前缀和。

所以最终答案是:

\[( \prod_{i=1}^n \prod_{j=1}^n i \times j ) \times ( \prod_{i=1}^n \prod_{j=1}^n \frac{1}{(\gcd(i,j))^2})
\]

\[= (n!)^{2 \times n} \times \prod_{d=1}^n d^{(2 \times f_{\lfloor \frac{n}{d} \rfloor} - 1)^{-2}}
\]

这样,就可以用 \(O(n \log n)\) 解决问题。

可是,你会发现,这道题目时间限制和空间限制都有点紧,而且常数还挺大,所以不得不考虑优化。

而且, \(f\) 数组爆 \(\texttt{long long}\) 之后,似乎不能随便取模,这是个难题。

注:带个 \(\log\) 是因为我们需要计算快速幂。

我们发现 \(104857601\) 是个质数。那么模质数呢,可以直接用在质数上模掉。

欧拉定理即:

\[a^{\phi_p} \equiv 1 \pmod p
\]

所以,再化一步:

\[= (n!)^{2 \times n} \times \prod_{d=1}^n d^{((2 \times f_{\lfloor \frac{n}{d} \rfloor} - 1) \% (MOD-1))^{-2}}
\]

然后呢,直接一波 欧拉筛 解决问题!

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll MOD=104857601;
const int N=1e6+1;
const int N1=1e5+1; inline ll read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
ll x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;} int n,phi[N],prime[N1],f=0;
bool h[N]; ll k=1; inline ll pw(ll x,ll y) {
ll ans=1; while(y) {
if(y&1) ans=(ans*x)%MOD;
x=(x*x)%MOD; y>>=1;
} return ans;
} //快速幂模板 inline void Euler() {
phi[1]=1; h[1]=1;
for(int i=2;i<=n;i++) {
k=(ll(k*i)%MOD); //顺便处理个阶乘
if(!h[i]) prime[++f]=i,phi[i]=i-1;
for(int j=1;j<=f && i*prime[j]<=n;j++) {
h[i*prime[j]]=1;
if(i%prime[j]==0) {
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
} //欧拉筛模板 int main(){
n=read(); Euler();
// printf("%lld\n",k);
k=pw(k,n<<1); ll ans=1; //第一部分的值
// printf("%lld\n",k);
// for(int i=1;i<=n;i++) printf("%d ",phi[i]);
// putchar('\n');
for(int i=1;i<=n;i++) phi[i]=(phi[i]<<1)+phi[i-1]%(MOD-1); //计算2倍的时候直接模掉
for(int i=2;i<=n;i++) ans=(ans*pw(i,phi[n/i]-1))%MOD; //第二部分
printf("%lld\n",(k*pw(ll(ans*ans)%MOD,MOD-2))%MOD); //然后 -2 次方,就是2次方的倒数,而倒数已经转换为逆元
return 0;
}

洛谷 P5221 Product 题解的更多相关文章

  1. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  2. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  3. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  4. [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)

    [POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...

  5. [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解

    原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...

  6. [洛谷P3948]数据结构 题解(差分)

    [洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...

  7. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  8. 洛谷P1189 SEARCH 题解 迭代加深

    题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...

  9. NOIP 2016 洛谷 P2827 蚯蚓 题解

    题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...

随机推荐

  1. 添砖加瓦:Linux /proc目录简介

    Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系 ...

  2. vmware增加新硬盘无需重启生效

    echo "scsi add-single-device 2 0 2 0" > /proc/scsi/scsi # echo "scsi add-single-de ...

  3. Leetcode 981. Time Based Key-Value Store(二分查找)

    题目来源:https://leetcode.com/problems/time-based-key-value-store/description/ 标记难度:Medium 提交次数:1/1 代码效率 ...

  4. js案例之使用正则表达式进行验证数据正确性

    #js案例之使用正则表达式进行验证数据正确性 代码上传至 "GitHub" 样例: <tr> <td>密码:</td> <td> & ...

  5. java集合-set

    #java集合-set Map用于存储key-value的映射,其中key的值是不能重复的.并且还需要正确的覆写equals方法和hashCode方法 如果我们只需要存储不重复的key,并不需要存储对 ...

  6. Java Web环境配置

    准备工作 jdk-8u241 apache-tomcat-9.0.31-windows-x64.zip Eclipse IDE for Enterprise Java Developers 关于版本选 ...

  7. 前端每日实战:123# 视频演示如何用纯 CSS 创作一架双冀飞机

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/yxVYRL 可交互视频 此视频是可 ...

  8. IDEA 配置自定义Apache与PHP环境

    1. PHP环境 1.1 插件的安装 1.2 关于php环境的配置 2.关于apache的配置 至此,已经配置成功啦,愉快的学习吧!

  9. 微信小程序结构目录、配置介绍、视图层(数据绑定,运算,列表渲染,条件渲染)

    目录 一.小程序结构目录 1.1 小程序文件结构和传统web对比 1.2 基本的项目目录 二.配置介绍 2.1 配置介绍 2.2 全局配置app.json 2.3 page.json 三.视图层 3. ...

  10. Git提交代码冲突:commit your changes or stash them before you can merge.

    用git pull拉取远程分支代码时候遇到如下问题: error: Your local changes to the following files would be overwritten by ...