洛谷P4902乘积

题意简述:

给 $ t $ 组 $ (a,b) $ 求:

$ \prod_{i=A}{B}\prod_{j=1}{i}(\frac{i}{j})^{\lfloor \frac{i}{j} \rfloor}\ (\bmod \ 19260817) $



$ solution: $

考试都去想 $ T2 $ 了……

题目是真的不错,首先看到题面我们可以想到三个角度:

  1. 预处理再回答
  2. 分子分母可以分开求
  3. 将询问拆成 $ (1,b)/(1,a-1) $ 于是可以默认从一开始

然后我们先看分子, $ \prod_{i=1}{n}\prod_{j=1}{i}i^{\lfloor \frac{i}{j} \rfloor} $ 这个东西我们可以先求出对于每一个 $ i $ 的 $ \prod_{j=1}{i}i{\lfloor \frac{i}{j} \rfloor} $ ,然会前缀积。对于每个 $ \prod_{j=1}{i}i{\lfloor \frac{i}{j} \rfloor} $ 我们可以考虑化简: $ i{\prod_{j=1}{i} \lfloor \frac{i}{j} \rfloor} $ 。这个指数我们观察法(或者将 $ i-1 $ 和 $ i $ 比较)可以发现和约数合数有关,并且就是约数前缀和。而约数前缀和是 $ nlogn $ 的,符合要求。

然后我们看分母, $ \prod_{i=1}{n}\prod_{j=1}{i}(\frac{1}{j})^{\lfloor \frac{i}{j} \rfloor} $ ,这个同样可以先求出对于每一个 $ i $ 的 $ \prod_{j=1}^{i}\frac{1}{j} ^{\lfloor \frac{i}{j} \rfloor} $ ,然会前缀积。其实 $ \frac{1}{j} $ 可以通过预处理逆元来完成,实际上我们只需要知道求 $ \prod_{j=1}{i}j{\lfloor \frac{i}{j} \rfloor} $ 即可。这个东西我们将 $ i-1 $ 和 $ i $ 比较,可以发现每次 $ i+1 $ 这个式子就会乘上 $ i $ 的所有约数的乘积。用约数筛法可以递推得到。

上述两个过程都可以在约数筛的同时一并完成,处理好逆元,还可以 $ O(1) $ 回答。



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#define ll long long
#define db double
#define rg register int using namespace std; const int mod=19260817; int t,n;
int a[1000005]; //询问
int b[1000005];
int f[1000005]; //分子
int g[1000005]; //分母
int s[1000005]; //答案
int inv[1000005]; inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
if(sign)return -res; else return res;
} inline int ksm(ll x,int y){ //快速幂
rg res=1;
while(y){
if(y&1)res=res*x%mod;
x=x*x%mod; y>>=1;
}return res;
} int main(){
t=qr(); inv[1]=1;
for(rg i=1;i<=t;++i){
a[i]=qr(),b[i]=qr();
n=max(n,max(a[i],b[i])); //求上界
}
for(rg i=2;i<=n;++i) inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod; //线性求逆元
for(rg i=0;i<=n;++i) g[i]=1; //初始化
for(rg i=1;i<=n;++i){
for(rg j=i;j<=n;j+=i)
++f[j],g[j]=(ll)g[j]*inv[i]%mod; //将这个数的贡献计入它的倍数里
f[i]+=f[i-1]; //约数个数前缀和
g[i]=(ll)g[i-1]*g[i]%mod; //约数前缀积
} f[0]=g[0]=s[0]=1;
for(rg i=1;i<=n;++i){
f[i]=ksm(i,f[i]); //计算逆元
f[i]=(ll)f[i-1]*f[i]%mod; //约数个数的前缀和的前缀积
g[i]=(ll)g[i-1]*g[i]%mod; //约数前缀积的前缀积
s[i]=(ll)f[i]*g[i]%mod; //计算1-i的答案
}
for(rg i=1;i<=t;++i){
rg x=a[i],y=b[i];
printf("%lld\n",(ll)s[y]*ksm(s[x-1],mod-2)%mod); //(a~b)=(1~b)/(1~(a-1))
}
return 0;
}

洛谷 P4902 乘积 (约数筛,前缀和(积))的更多相关文章

  1. 洛谷P4902乘积

    题面链接 洛谷 题意简述 求\(\prod_{i=A}^B\prod_{j=1}^i \lgroup \frac{i}{j} \rgroup ^{\lfloor \frac{i}{j} \rfloor ...

  2. LOJ #2185 / 洛谷 P3329 - [SDOI2015]约数个数和(莫比乌斯函数)

    LOJ 题面传送门 / 洛谷题面传送门 题意: 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij)\),\(d(x)\) 为 \(x\) 的约数个数. \( ...

  3. 洛谷 P3327 [SDOI2015]约数个数和 || Number Challenge Codeforces - 235E

    https://www.luogu.org/problemnew/show/P3327 不会做. 去搜题解...为什么题解都用了一个奇怪的公式?太奇怪了啊... 公式是这样的: $d(xy)=\sum ...

  4. 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)

    传送门 公式太长了……我就直接抄一下这位大佬好了……实在懒得打了 首先据说$d(ij)$有个性质$$d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]$$ 我们所求的答案为$ ...

  5. 洛谷$P$3327 约数个数和 $[SDOI2015]$ 莫比乌斯反演

    正解:莫比乌斯反演 解题报告: 传送门! 先考虑证明一个结论,$d_{i\cdot j}=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]$ 看起来就很对的样子,但还是证下趴$QwQ ...

  6. Solution -「洛谷 P5325」Min_25 筛

    \(\mathcal{Description}\)   Link.   对于积性函数 \(f(x)\),有 \(f(p^k)=p^k(p^k-1)~(p\in\mathbb P,k\in\mathbb ...

  7. 【埃氏筛】洛谷P3383埃氏筛模板

    思路: 如果我们要筛出 [1, n] 内的所有素数,使用 [1, √n] 内的素数去筛就可以了 设bool型数组 a,a[i] 表示 i 是否被某个素数筛过 从 2 开始枚举每个数 i: 若 a[i] ...

  8. [洛谷P3383][模板]线性筛素数-欧拉筛法

    Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...

  9. 洛谷P1209-最大公约数与最小公倍数问题

    一个萌新的成长之路 Discription 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P, ...

随机推荐

  1. 555E Case of Computer Network

    分析 一个连通块内的肯定不影响 于是我们先缩点 之后对于每个路径 向上向下分别开一个差分数组 如果两个数组同时有值则不合法 代码 #include<bits/stdc++.h> using ...

  2. WPF中的WndProc

    其实,在WPF中,要想利用WndProc来处理所有的事件,需要利用到SourceInitialized  Event,首先需要创建一个HwndSource对象,然后利用其AddHook方法来将所有的w ...

  3. Spring MVC集成Swagger2.0

    在集成Swagger之前,得先说说什么是Swagger,它是用来做什么的,然后再讲讲怎么集成,怎么使用,当然,在这之前,需要了解一下OpenAPI. OpenAPI OpenAPI 3.0规范定义了一 ...

  4. Python中的Django框架中prefetch_related()函数对数据库查询的优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  5. BigDecimal进行加减乘除计算

    以前大部分关于查询计算的逻辑是在sql语句中执行的,但是有时候会出现比较复杂的计算情况,需要我们在代码中进行计算,这个时候使用BigDecimal进行计算会很方便. BigDecimal num1 = ...

  6. springBoot(1) 环境安装

    真鸡儿要命.今天做开发.实在是整不动了...所以决定回家,干一波... 发现MyEclipse2014好像真的不用能用了... 瞬间焦头烂额,本来,就跑不了.现在环境也没一个能用的. 于是 就有了今天 ...

  7. Lesson 4 The double life of Alfred Bloggs

    There are two type of people in the society. People who do manual works can higher payment than peop ...

  8. 【Linux开发】Linux下jpeglib库的安装详解

    Linux下jpeglib库的安装详解 首先要下载所需的库压缩包:jpegsrc.v6b.tar.gz或 jpegsrc.v8b.tar.gz 然后将下载的压缩包随便放在和解压到你喜欢的地方. # t ...

  9. 深入理解java:1.2. 字节码执行引擎

    执行引擎是Java虚拟机的核心组成部分之一. 首先,想想C++和Java在编译和运行时到底有啥不一样? 下图左边,C++发布的就是机器指令, 而下图右边Java发布的是字节码,字节码在运行时通过JVM ...

  10. docker--docker 容器操作

    6 docker 容器操作 容器是 docker 镜像的运行时实例. 6.1 创建容器 docker run [options] image command [ARG...]options选项: ‐i ...