题目

我们要求的是

\[\prod\limits_{i=a}^b\prod\limits_{j=1}^i(\frac ij)^{\lfloor\frac ij\rfloor}
\]

先把它拆开

\[\prod\limits_{i=a}^b\prod\limits_{j=1}^ii^{\lfloor\frac ij\rfloor}(\frac1{\prod\limits_{i=a}^b\prod\limits_{j=1}^ij^{\lfloor\frac ij\rfloor}})
\]

对于右边,我们把\(j\in[1,i]\)换成\(j\in[1,b]\)是没有任何问题的。因为\(\forall j\in(i,b],\lfloor\frac ij\rfloor=0\),相当于多乘了几个\(1\)。

然后再交换右边的连乘符号

\[\prod\limits_{i=a}^b\prod\limits_{j=1}^ii^{\lfloor\frac ij\rfloor}(\frac1{\prod\limits_{j=1}^b\prod\limits_{i=a}^bj^{\lfloor\frac ij\rfloor}})
\]

我们把连乘换成指数的求和

\[\prod\limits_{i=a}^bi^{\sum\limits_{j=1}^i\lfloor\frac ij\rfloor}(\frac1{\prod\limits_{j=1}^bj^{\sum\limits_{i=a}^b\lfloor\frac ij\rfloor}})
\]

然后容斥一下

\[\prod\limits_{i=1}^bi^{\sum\limits_{j=1}^i\lfloor\frac ij\rfloor}\prod\limits_{j=1}^{a-1}j^{\sum\limits_{i=1}^{a-1}\lfloor\frac ij\rfloor}(\frac1{\prod\limits_{j=1}^bj^{\sum\limits_{i=1}^b\lfloor\frac ij\rfloor}\prod\limits_{i=1}^{a-1}i^{\sum\limits_{j=1}^i\lfloor\frac ij\rfloor}})
\]

\[let\ a=a-1,f(n)=\prod\limits_{i=1}^ni^{\sum\limits_{j=1}^i\lfloor\frac ij\rfloor},g(n)=\prod\limits_{j=1}^nj^{\sum\limits_{i=1}^n\lfloor\frac ij\rfloor}
\]

则要求的式子就变成了

\[f(b)g(a)(\frac1{f(a)g(b)})
\]

所以如果我们能够以\(O(nlog\ n)\)的复杂的筛出\(f,g\)的话就能解决问题。

首先计算\(f\)

\[let\ \sigma(n)=\sum\limits_{d|n}1,d(n)=\sum\limits_{i=1}^n\sigma(i)
\]

考虑到枚举约数和枚举倍数的等价性

\[d(n)=\sum\limits_{i=1}^n\lfloor\frac ni\rfloor
\]

\[f(n)=\prod\limits_{i=1}^ni^{d(i)}
\]

显然其递推式为

\[f(n)=f(n-1)n^{d(n)}
\]

所以我们可以\(O(nlog\ n)\)筛出\(\sigma\)即除数函数,然后前缀和求出,\(d\),再按递推式求出\(f\)。

注意\(d\)是作为指数存在,所以取模时需要对\(P-1\)取模。

再计算\(g\)

\[let\ t(n)=\frac{g(n)}{g(n-1)}=\prod\limits_{i=1}^ni^{\lfloor\frac ni\rfloor},h(n)=\frac{t(n)}{t(n-1)}=\prod\limits_{d|n}d
\]

显然我们可以\(O(nlog\ n)\)筛出\(h\)即约数积函数,然后做两遍前缀积就可以得到\(g\)。

#include<bits/stdc++.h>
using namespace std;
namespace IO
{
char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
void Flush(){fwrite(obuf,1,oS-obuf,stdout),oS=obuf;}
void Put(char x){*oS++=x;if(oS==oT)Flush();}
int read(){int x=0;char ch=Get();while(ch>57||ch<48)ch=Get();while(ch>=48&&ch<=57)x=x*10+(ch^48),ch=Get();return x;}
void write(int x){int top=0;if(!x)Put('0');while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put('\n');}
}
using namespace IO;
const int N=1000007,A=1000000,P=993244853;
int inc(int a,int b,int p=P){a+=b;return a>=p? a-p:a;}
int mul(int a,int b){return 1ll*a*b%P;}
int power(int a,int k){int r=1;for(;k;k>>=1,a=mul(a,a))if(k&1)r=mul(a,r);return r;}
int d[N],s[N],f[N];
int main()
{
int i,j,n,a,b;
s[0]=f[0]=1;
for(i=1;i<=A;++i) s[i]=1;
for(i=1;i<=A;++i) for(j=i;j<=A;j+=i) ++d[j],s[j]=mul(s[j],i);
for(i=1;i<=A;++i) d[i]=inc(d[i],d[i-1],P-1),f[i]=mul(f[i-1],power(i,d[i])),s[i]=mul(s[i],s[i-1]);
for(i=1;i<=A;++i) s[i]=mul(s[i],s[i-1]);
for(n=read();n;--n) a=read()-1,b=read(),write(mul(mul(mul(power(f[a],P-2),f[b]),power(s[b],P-2)),s[a]));
return Flush(),0;
}

Luogu P4902 乘积的更多相关文章

  1. 洛谷 P4902 乘积 (约数筛,前缀和(积))

    洛谷P4902乘积 题意简述: 给 $ t $ 组 $ (a,b) $ 求: $ \prod_{i=A}^{B}\prod_{j=1}^{i}(\frac{i}{j})^{\lfloor \frac{ ...

  2. Luogu - P1018 乘积最大 - 题解

    原文:https://www.luogu.org/problemnew/solution/P1018?page=7 题目:P1018[乘积最大] 前言: 这题的正解理论上说是DP,可是由于民间数据太水 ...

  3. luogu P1018 乘积最大

    题目描述 今年是国际数学联盟确定的"2000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...

  4. 洛谷P4902乘积

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

  5. 与高精死杠的几天——记两道简单的高精dp

    (同样也是noip往年的题 1​.矩阵取数游戏 题目链接[Luogu P1005 矩阵取数游戏] \(\mathcal{SOLUTION}:\) 通过对题目条件的分析,我们可以发现,每一行取数对答案的 ...

  6. Luogu 1060 开心的金明 / NOIP 2006 (动态规划)

    Luogu 1060 开心的金明 / NOIP 2006 (动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨 ...

  7. Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)

    Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...

  8. Luogu P4643 【模板】动态dp

    题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...

  9. luogu P5291 [十二省联考2019]希望

    luogu loj 无论最终结果将人类历史导向何处 \(\quad\)我们选择 \(\quad\quad\)\(\large{希望}\) 诶我跟你讲,这题超修咸的 下面称离连通块内每个点距离不超过\( ...

随机推荐

  1. 2019牛客暑期多校训练营(第二场)D bitset

    题意 给一个n个结点的带点权的图,找到第k小的团的权值 分析 用bitset表示团的状态,一个结点必须和团里的每个结点都连边才能加进去,所以可以直接用\(\&\)运算来判断一个结点是否能加进去 ...

  2. flask-数据库 进阶

    1. 级联操作 Cascade意为“级联操作”,就是在操作一个对象的同时,对相关的对象也执行某些操作.我们通过一个Post模型和Comment模型来演示级联操作,分别表示文章(帖子)和评论,两者为一对 ...

  3. C++入门经典-例7.8-const对象,标准尺寸

    1:当建立一个对象之后,如果不希望它的任何数据发生改变,可以将其直接声明为const对象,例如: const 类名 对象名 const对象必须初始化.我们可以调用它的数据和函数,但是不可以对他们进行修 ...

  4. leetcode题目5.最长回文子串(中等)

    题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: ...

  5. DL反向传播理解

    作者:寒小阳 时间:2015年12月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/50321873 声明:版权所有,转载请联系作者并注明 ...

  6. Web存储机制—sessionStorage,localStorage使用方法

    Web存储机制,在这里主要聊有关于Web Storage API提供的存储机制,通过该机制,浏览器可以安全地存储键值对,比使用cookie更加直观.接下来简单的了解如何使用这方面的技术. 基本概念 W ...

  7. String,int,Integer之间的转换

    public class Test{ public static void main(String[] args) { //int转换成Integer Integer in = new Integer ...

  8. vue路由在keep-alive下的刷新问题 对watch的影响

    转载自:https://www.cnblogs.com/dansingal/p/8302100.html 问题描述: 在keep-alive中的在跳转到指定的路由时刷新对应的路由,其余不刷新. 1 2 ...

  9. javascript之Number对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...