CodeChef-RNDRATIO Mysterious Ratio

题意简述:

对每个 \(1 \le i \le n\) ,随机选择一个数 \(A_i\) ,满足 \(L_i \le A_i \le R_i\) ,求 \(\mathrm{lcm}_{i=1}^n A_i\) 的期望。

\(1 \le n \le 10^5\) , \(1 \le L_i \le R_i \le 10^5\) 。

Example Input:

2
1
1 3
2
2 4
5 5

Example Output:

1
15

好久没做毒瘤式子题,推错好几次...

不过后面用到的乘法差分还是比较新颖,记录一下吧。

答案显然是这个式子——

\[\prod_{i=1}^n (R_i-L_i+1)^{-1} \sum_{\begin{aligned}L_i \le &A_i \le R_i \\ 1 \le &i \le n\end{aligned}} \frac{\prod_{i=1}^n A_i}{\gcd_{i=1}^{n} A_i}
\]

前面的 \(\prod\) 是常数可以先抛开,后面就暴算吧。(等式右边 \(\cdots\) 后有少许说明)

\[\begin{aligned}
\sum_{L_i \le A_i \le R_i} \frac{\prod A_i}{\gcd A_i}
&= \sum_{k=1}^{\min R_i} \sum_{L_i \le A_i \le R_i} [\gcd A_i = k] \frac{\prod A_i}{k} \\
&= \sum_k k^{n-1} \sum_{\lceil \frac{L_i}{k} \rceil \le B_i \le \lfloor \frac{R_i}{k} \rfloor} [\gcd B_i = 1] \prod B_i \qquad \qquad \cdots ( \ k B_i = A_i \ ) \\
&= \sum_k k^{n-1} \sum_{\lceil \frac{L_i}{k} \rceil \le B_i \le \lfloor \frac{R_i}{k} \rfloor} \sum_{d|\gcd B_i} \mu(d) \prod B_i \qquad \qquad \cdots ( \ \sum_{d|n} \mu(d) = [n=1] \ ) \\
&= \sum_k k^{n-1} \sum_{d=1}^{\lfloor \frac{\min R_i}{k} \rfloor} \mu(d) d^n \sum_{\lceil \frac{L_i}{kd} \rceil \le C_i \le \lfloor \frac{R_i}{kd} \rfloor} \prod C_i \qquad \quad \ \cdots ( \ d C_i = B_i , \ \frac{\lfloor \frac{a}{b} \rfloor}{c} = \lfloor \frac{a}{bc} \rfloor \ ) \\
&= \sum_k k^{n-1} \sum_{d} \mu(d) d^n \prod_{i=1}^n \sum_{\lceil \frac{L_i}{kd} \rceil \le x \le \lfloor \frac{R_i}{kd} \rfloor} x \\
&= \sum_k k^{n-1} \sum_{d} \mu(d) d^n \prod_{i=1}^n \left( S(\lfloor \frac{R_i}{kd} \rfloor) - S(\lceil \frac{L_i}{kd} \rceil -1) \right) \qquad \qquad \qquad \cdots ( \ S(n) = \sum_{x=1}^n x \ ) \\
&= \sum_{T=1}^{\min R_i} \left( \sum_{d|T} \mu(d) (\frac{T}{d})^{n-1} d^n \right) \prod_{i=1}^n \left( S(\lfloor \frac{R_i}{T} \rfloor) - S(\lceil \frac{L_i}{T} \rceil -1) \right) \qquad \ \cdots ( \ T = kd \ ) \\
&= \sum_T T^{n-1} \left( \sum_{d|T} \mu(d) d \right) \prod_{i=1}^n \left( S(\lfloor \frac{R_i}{T} \rfloor) - S(\lceil \frac{L_i}{T} \rceil -1) \right)
\end{aligned}
\]

所以最终的式子便是

\[\prod_{i=1}^n (R_i-L_i+1)^{-1} \sum_{T=1}^{\min R_i} T^{n-1} f(T) \prod_{i=1}^n \left( S(\lfloor \frac{R_i}{T} \rfloor) - S (\lceil \frac{L_i}{T} \rceil -1) \right)
\]

其中

\[S(n) = \frac{n(n+1)}{2}
\]
\[f(n) = \sum_{d|T} \mu(d) d
\]

显然 \(f(n)\) 是个积性函数,故可以用线性筛预处理出其前 \(n\) 项,只需用到如下的性质

\[f(p^c) = \sum_{i=0}^c \mu(p^i) p^i = 1 - p \quad (c \ge 2)
\]

其实如果所有 \(Li,R_i\) 都相等的话就可以直接上杜教筛 / min25筛之类的黑科技把复杂度优化到 \(O(n^{1-\omega})\) 了,但这道题很不套路的不相等,所以我们需要找到方法对所有 \(T\) 快速计算后面的 \(\prod\) 。

正解巧妙的使用了乘法差分。首先 \(O(n \sqrt n)\) 对所有 \(i\) 都整除分块一次得到区间,然后在 \(T\) 上做乘法差分,每个分块区间乘上贡献 \(S(\lfloor \frac{R_i}{T} \rfloor) - S (\lceil \frac{L_i}{T} \rceil -1)\) 。最后计算的时候扫一遍就能拿到每个 \(T\) 对应的 \(\prod\) 的值了。

注意对 \(0\) 的特殊处理。

CodeChef上跑不过,懒得卡常了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
typedef double db;
ll Rd(){
ll ans=0;bool fh=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') fh=1; c=getchar();}
while(c>='0'&&c<='9') ans=ans*10+c-'0',c=getchar();
if(fh) ans=-ans;
return ans;
} ll CD(ll a,ll b){return (a-1)/b+1;} //CeilDiv
const ll MOD=998244353,INF=1E18;
#define _ %MOD
ll PMod(ll x){
if(x>=MOD) return x-MOD;
else if(x<0) return x+MOD;
else return x;
}
ll QPow(ll x,ll up){
PMod(x _);ll ans=1;
while(up){
if(up%2==0) x=x*x _,up/=2;
else ans=ans*x _,up--;
}
return ans;
}
ll Inv(ll x){return QPow(x,MOD-2);}
const ll INV2=Inv(2); const ll MXN=1E5+5;
ll P[MXN],pN;
bool notP[MXN];
ll f[MXN];//\sum_{d|n} \mu(d) d
void LinearSieve(ll n){
notP[1]=1;for(ll i=2;i<=n;i++) notP[i]=0;
pN=0;f[1]=1;
for(ll i=2;i<=n;i++){
if(!notP[i]){
P[++pN]=i;
f[i]=PMod(1-i);
}
for(ll j=1;j<=pN&&i*P[j]<=n;j++){
notP[i*P[j]]=1;
if(i%P[j]==0){
f[i*P[j]]=f[i];
break;
}
f[i*P[j]]=f[i]*f[P[j]]_;
}
}
}
ll S(ll n){return n*(n+1)_*INV2 _;}
ll N,MI;
ll L[MXN],R[MXN];
/*namespace Normal{
void Solve(){
ll Ans=0;
for(ll t=1;t<=MI;t++){
ll pdt=1;for(ll i=1;i<=N;i++) pdt=pdt*PMod(S(R[i]/t)-S(CD(L[i],t)-1))_;
Ans=(Ans+QPow(t,N-1)*f[t]_*pdt)_;
}
ll pdt=1;for(ll i=1;i<=N;i++) pdt=pdt*Inv(R[i]-L[i]+1)_;
Ans=Ans*pdt _;
printf("%lld\n",Ans);
}
}*/
namespace Lunatic{
ll diff[MXN],zero[MXN];
ll bl[MXN],br[MXN],blN,brN;
void PutDiff(){
for(ll k=1;k<=MI;k++) diff[k]=1,zero[k]=0;
for(ll i=1;i<=N;i++){
brN=0;for(ll t=1;t<=R[i];t=R[i]/(R[i]/t)+1) br[++brN]=R[i]/(R[i]/t);
br[++brN]=MI;
blN=0;for(ll t=MI;t>=1;t=CD(L[i],CD(L[i],t))-1) bl[++blN]=t;
for(ll j=blN,k=1,st=1,ed;st<=MI;st=ed+1){
if(bl[j]<br[k]||k>brN) ed=bl[j--];
else ed=br[k++];
ll t=ed;
ll val=PMod(S(R[i]/t)-S(CD(L[i],t)-1));
if(val){
diff[st]=diff[st]*val _;
diff[ed+1]=diff[ed+1]*Inv(val)_;
}else{
zero[st]++;
zero[ed+1]--;
}
}
}
}
void Solve(){
PutDiff();
ll Ans=0;
ll pdt=1,zn=0;
for(ll t=1;t<=MI;t++){
zn+=zero[t];pdt=pdt*diff[t]_;
if(!zn) Ans=(Ans+QPow(t,N-1)*f[t]_*pdt)_;
}
pdt=1;for(ll i=1;i<=N;i++) pdt=pdt*Inv(R[i]-L[i]+1)_;
Ans=Ans*pdt _;
printf("%lld\n",Ans);
}
}
int main(){
LinearSieve(MXN-1);
ll T=Rd();while(T--){
N=Rd();
MI=INF;
for(ll i=1;i<=N;i++){
L[i]=Rd();R[i]=Rd();
MI=min(MI,R[i]);
}
//Normal::Solve();
Lunatic::Solve();
}
return 0;
}

CodeChef-RNDRATIO Mysterious Ratio 题解的更多相关文章

  1. Codechef Not a Triangle题解

    找出一个数组中的三个数,三个数不能组成三角形. 三个数不能组成三角形的条件是:a + b < c 两边和小于第三边. 这个问题属于三个数的组合问题了.暴力法可解,可是时间效率就是O(n*n*n) ...

  2. CodeChef March Challenge 2019题解

    传送门 \(CHNUM\) 显然正数一组,负数一组 for(int T=read();T;--T){ n=read(),c=d=0; fp(i,1,n)x=read(),x>0?++c:++d; ...

  3. codechef MAY18 div2 部分题解

    T1 https://www.codechef.com/MAY18B/problems/RD19 刚开始zz了,其实很简单. 删除一个数不会使gcd变小,于是就只有0/1两种情况 T2 https:/ ...

  4. AT1980 [AGC001B] Mysterious Light 题解

    # 题意:高桥 くん 有一个边长为 N 的三枚镜子构成的正三角形 , 顶点为 a, b, c. 他有一个超级步枪 , 放在 AB 段的P点上,使得 AP=X . 并沿着平行于 BC 的方向发射一道光 ...

  5. codechef Jewels and Stones 题解

    Soma is a fashionable girl. She absolutely loves shiny stones that she can put on as jewellery acces ...

  6. CodeChef April Challenge 2019题解

    传送门 \(Maximum\ Remaining\) 对于两个数\(a,b\),如果\(a=b\)没贡献,所以不妨假设\(a<b\),有\(a\%b=a\),而\(b\%a<a\).综上, ...

  7. CodeChef August Lunchtime 2014 题解

    A题 给一个由a和b两种类型的字符组成的字符串,每次可以从中选取任意长度的回文子序列(不一定连续)并删除.问最少需要几次能将整个字符串为空. 思路:如果本身是个回文串,那么只需要一次,否则需要两次(第 ...

  8. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  9. CodeChef FNCS

    题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...

随机推荐

  1. 许嵩新歌《放肆》发布 && 递归 + Stream+Lambda相遇成树

    一.<放肆>如约而至 今早5:00在迷迷糊糊中醒来,打开手机一看,许嵩又发新歌了,名字叫做<放肆>,澎湃的旋律,依旧古典高雅的用词,这个大男孩,已经不像12年那时候发些伤感非主 ...

  2. 多测师讲解python函数 _zip_高级讲师肖sir

    # zip函数 #zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存.1.使用zip讲两个列表打印出来的结果是 ...

  3. Jmeter之参数化函数助手__CSVRead

    1.在Tool->函数对话框中选择__CSVRead,2处填写测试用例的文档地址(测试用例要以csv格式保存),3处是测试用例中参数的位置,第一栏参数的CSV文件列号填0,第二栏参数的CSV文件 ...

  4. anaconda 取消每次默认启动base环境

    安装conda后取消命令行前出现的base,取消每次启动自动激活conda的基础环境 方法一: 每次在命令行通过conda deactivate退出base环境回到系统自动的环境 方法二 1,通过将a ...

  5. 纯CSS+HTML自定义checkbox效果[转]

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. day73:drf:drf视图相关类&路由Routers&创建虚拟环境

    目录 1.APIView 2.GenericAPIView:通用视图类 3.5个视图扩展类:ListModelMixin,CreateModelMixin,RetrieveModelMixin,Upd ...

  7. git学习(四) git log操作

    git log操作 log命令的作用:用于查看git的提交历史: git log命令显示的信息的具体含义: commit SHA-1 校验和  commit id Author 作者跟邮箱概要信息 D ...

  8. 出Bug表-假如诸葛亮是程序员(1024程序员节日献礼)

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 出Bug表 南瓜言:先司创业未半而中道破产,今培训造才,网课套钱,此诚百家争鸣之时也.然优秀骨干组队离职,新招小白乐于摸鱼者 ...

  9. SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器

    今天接到一个FTP的需求,就是每天晚上把当天某个报表的数据自动保存excel上传到FTP服务器. SAP已经有现成的FTP函数使用,可以通过函数的方式来实现,实现前先准备一些数据: User:登录FT ...

  10. vue 组件传值,(太久不用就会忘记,留在博客里,方便自己查看)

    一 :父组件 传值给 子组件 方法: props //父组件 <template lang="html"> <div> <h3>我是父亲< ...