LuoguP5221 Product
题目地址
题解
注,下方\((i,j)\)均指\(gcd(i,j)\),以及证明过程有一定的跳步,请确保自己会莫比乌斯反演的基本套路。
介绍本题的\(O(n)\)和\(O(n\sqrt{n})\)做法,本题还有\(O(nlogn)\)做法,需要用到欧拉函数,或者是从质因子角度考虑也可以得到另外一个\(O(n)\)做法。
题目就是求
\]
考虑分解一下
\]
对于分子可得
&\prod_{i=1}^n\prod_{j=1}^nij\\
&=\prod_{i=1}^ni\prod_{j=1}^nj\\
&=\prod_{i=1}^ni*n!\\
&=(n!)^{2n}
\end{aligned}
\]
对于分母,我们考虑莫比乌斯反演
&\prod_{i=1}^n\prod_{j=1}^n(i,j)^2\\
&=\prod_{d=1}^nd^{2\sum_{i=1}^n\sum_{j=1}^n[(i,j)=d]}\\
&=\prod_{d=1}^nd^{2\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[(i,j)=1]}\\
&=\prod_{d=1}^nd^{2\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\lfloor\frac{n}{kd}\rfloor^2}\\
\end{aligned}
\]
至此,枚举\(d\),对指数整除分块,即可\(O(n\sqrt{n})\)解决此题。
容易发现\(\lfloor\frac{n}{d}\rfloor\)是可以整除分块的。那么怎么处理区间\([l,r]\)的\(d\)呢,将它展开,其实就是\(\frac{r!}{(l-1)!}\),由于出题人卡空间,所以可以直接计算阶乘而不是预处理(复杂度同样是\(O(n)\),每个数只会被遍历一次)
那么就可以做到\(O(n)\)解决本题了。
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int mod = 104857601;
const int p = 104857600;
const int N = 1000010;
bool vis[N];
short mu[N];
int pr[N], cnt = 0;
int fac;
int power(int a, int b, int Mod) {
int ans = 1;
while(b) {
if(b & 1) ans = (ll)ans * a % Mod;
a = (ll)a * a % Mod;
b >>= 1;
}
return ans % Mod;
}
void init(int n) {
mu[1] = 1;
for(int i = 2; i <= n; ++i) {
if(!vis[i]) pr[++cnt] = i, mu[i] = -1;
for(int j = 1; j <= cnt && i * pr[j] <= n; ++j) {
vis[i * pr[j]] = 1;
if(i % pr[j] == 0) break;
mu[i * pr[j]] = -mu[i];
}
mu[i] += mu[i - 1];
}
fac = 1;
for(int i = 1; i <= n; ++i) fac = (ll)fac * i % mod;
}
int n;
int calc2(int n) {
int ans = 0;
for(int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
ans = (ans + (ll)(n / l) * (n / l) % p * (mu[r] - mu[l - 1] + p) % p) % p;
}
return ans % p;
}
int main() {
scanf("%d", &n);
init(n);
int ans = 1;
int sum = power((ll)fac * fac % mod, n, mod);
for(int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l); fac = 1ll;
for(int i = l; i <= r; ++i) fac = (ll)fac * i % mod;
int t = power((ll)fac * fac % mod, calc2(n / l), mod);
ans = (ll)ans * t % mod;
}
printf("%lld\n", (ll)sum * power(ans, mod - 2, mod) % mod);
}
LuoguP5221 Product的更多相关文章
- uva 11059 maximum product(水题)——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAB1QAAAMcCAIAAABo0QCJAAAgAElEQVR4nOydW7msuhKF2wIasIAHJK
- [LeetCode] Product of Array Except Self 除本身之外的数组之积
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- vector - vector product
the inner product Givens two vectors \(x,y\in \mathbb{R}^n\), the quantity \(x^\top y\), sometimes c ...
- 1 Maximum Product Subarray_Leetcode
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- Leetcode Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- Where product development should start
We all need to know our customers in order to create products they’ll actually buy. This is why the ...
- [LintCode] Product of Array Except Self 除本身之外的数组之积
Given an integers array A. Define B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], calculate B WI ...
- sp_addlinkedserver '(null)' is an invalid product name
使用SSMS 2008客户端工具逆向生成了创建链接服务器的脚本时,在测试环境执行是报如下错误:'(null)' is an invalid product name. USE [master] GO ...
随机推荐
- 14. Longest Common Prefix(暴力循环)
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
- css 文字样式
Gradient 3D text 代码区域 /*css */ body { background-color: #272727; } h1 { font-family: "Arial&quo ...
- 获取数据库连接对象Connection
2018-11-04 19:50:52 开始写 public Connection getConn() {//返回类型为Connection try { Class.forName("co ...
- multiprocessing 源码解析 更新中......
一.参考链接 1.源码包下载·链接: https://pypi.org/search/?q=multiprocessing+ 2.源码包 链接:https://pan.baidu.com/s/1j ...
- [openjudge-搜索]广度优先搜索之鸣人和佐助
题目描述 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸 ...
- bootstrapValidator验证表单后清除当次验证的方法
用bootstrapValidator的resetForm()方法: <!-- // create server begin --> <div class="modal f ...
- brctl 命令详解
安装网桥管理工具包:bridge-utile ```# yum install bridge-utils -y``` ```使用brctl命令创建网桥br1```# brctl addbr br1`` ...
- Python基础(一)_数据类型、条件判断、循环、列表
编译型语言(中文版)运行代码之前,要先编译.然后再运行编译时间比较长c.c++.c# 解释型语言(翻译版)运行的时候才去编译,运行一次编译.运行效率没有编译型语言快python.ruby.shell. ...
- centos6二进制安装mysql5.5
centos 6.5,安装mysql 5.5.60 所需安装包mysql-5.5.60-linux-glibc2.12-x86_64.tar.gz.ncurses-devel-5.7-4.200902 ...
- Ajax解决csrf_token的不同方式
ajax发送csrf_token的不同方式: 方式一: 在ajax发送之前,做好处理,用到了beforeSend方法,把csrf_token写入到Header头内,csrf_token去jquery. ...