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 ...
随机推荐
- Web API 跨域问题
解决办法: 1.web.config <system.webServer> <handlers> <remove name="ExtensionlessUrlH ...
- html5-css动画-2d
div{ width: 300px; height: 100px; margin: 50px; padding: 50px; background: green; ...
- E. Gerald and Giant Chess
E. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes2015-09-0 ...
- Knowing is not enough; we must apply. Willing is not enough; we must do.
Knowing is not enough; we must apply. Willing is not enough; we must do. 仅限于知道是不够的,我们必须去实践:单纯的希望是不够的 ...
- freedom is a kind of responsibility
张维迎教授在2017年7月1日北大国发院2017届毕业典礼上的发言<自由是一种责任> 张维迎:自由是一种责任 本文为张维迎教授在2017年7月1日北大国发院2017届毕业典礼上的发言 ...
- new sh file
创建新文件 sbash='#!/bin/bash' sauth='# auth: xiluhua' sdate="# date: $(date +%Y-%m-%d)" shead= ...
- The Little Prince-12/14
The Little Prince-12/14 世界上有那么多的玫瑰花,但是只有你们是一直陪伴在我身边,我们相互灌溉. ————世界上有那么多的人,但是只有你们是一直陪伴在我身边,我们相互关心. “在 ...
- 面试必问之JVM篇
前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记.现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书. 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干 ...
- Django之Ajax刷新记住用户名
使用Cookie方法记住用户名 1.创建登录路由 2.定义登录视图函数 判断cookie中是否存在username,存在就将username渲染到login.html模板页面中 3.进行Ajax验证 ...
- django创建app、在视图函数及url中使用参数、url命名、通过redirect实现网页路径跳转
app用来实现一个独立的功能,视图一般都写在app的view.py中,并且视图的第一个参数永远是request,视图的返回值必须是HttpResponseBase对象或子类的对象. 创建一个app:f ...