[XSY] 智慧树(线性同余方程组,线段树/树状数组)

智慧树

  • 解决此题有两个要点:
  1. 如何判断一个线性同余方程组有没有解
  2. 如何统计合法子序列数目
  • 先看第2点:
    若一个序列是合法的,则这个序列的所有子序列都是合法的
    考虑∀1≤i≤n\forall 1\leq i\leq n1in,求出以iii为左端点时,序列右端点最右能取到哪,记为nxt[i]nxt[i]nxt[i]
    若不考虑l,rl,rl,r的限制,所有合法子序列数=∑i=1n(nxt[i]−i+1)\sum_{i=1}^{n}(nxt[i]-i+1)i=1n(nxt[i]i+1)
  • 加入l,rl,rl,r的限制,相当于限制了:
    1.序列左端点必须≥l\geq ll
    2.序列右端点必须≤r\leq rr
    两个限制不好同时处理,我们考虑分开处理:
    -采用离线做法,把询问按lll从大到小排序,对每个询问,只考虑 序列左端点i≥i\geqi当前的lll 的序列,这样便可保证满足第一个限制。
    -对于第二个限制,维护cnt[j]cnt[j]cnt[j]表示 jjj是多少个 当前纳入考虑的合法序列 的右端点,则询问(l,r)(l,r)(l,r)的答案为∑j=lrcnt[j]\sum_{j=l}^{r}cnt[j]j=lrcnt[j]
    以上可以用线段树/树状数组维护(树状数组的区间修改、区间查询戳这里)。
  • 再看第1点:
  1. 朴素做法:
    既然不保证mim_imi为质数,那么就不能用CRTCRTCRT,只能用exCRTexCRTexCRT
    考虑方程组:
    {x≡b1(modm1)x≡b2(modm2)\begin{cases}x\equiv b_1(\mod m_1) \\x\equiv b_2(\mod m_2)\end{cases}{xb1(modm1)xb2(modm2)
    x=m1k1+b1=m2k2+b2x=m_1k_1+b_1=m_2k_2+b_2x=m1k1+b1=m2k2+b2
    ∴m1k1−m2k2=b2−b1\therefore m_1k_1-m_2k_2=b_2-b_1m1k1m2k2=b2b1
    由拓展欧几里得知,k1,k2k_1,k_2k1,k2有解,当且仅当∣b2−b1∣=gcd(m1,m2)|b_2-b_1|=gcd(m_1,m_2)b2b1=gcd(m1,m2)
    k1,k2k_1,k_2k1,k2有解,我们可以得到一个同时符合两条方程的xxx值,设为x′x'x
    那么两个方程可以合并为一个新的方程:
    x≡x′(modlcm(m1,m2))x\equiv x'(\mod lcm(m_1,m_2))xx(modlcm(m1,m2))
    用新方程再去和其它方程合并即可(ps:合并方程求nxtnxtnxt的过程可以用ST表优化)
  2. 正解:
    MMM较大时,由于解的模数较大,不宜基于求解来维护线性同余方程组。事实上,“求解”浪费了信息,我们只需要知道“是否有解”
  • 先考虑 mim_imi均为素数 的特殊情况:
    一个方程组无解,当且仅当方程组中存在两个方程:
    x≡bi(modp)x\equiv b_i(\mod p)xbi(modp)x≡bj(modp)x\equiv b_j(\mod p)xbj(modp),且bi!=bjb_i!=b_jbi!=bj

    为求nxtnxtnxt,我们维护一个由线性同余方程构成的队列,支持入队、出队和查询这些方程构成的方程组加上一个新方程组是否有解。
    而判断方程组有没有解,我们只需对每个素数ppp维护 目前限制xmodpx \mod pxmodp的余数是什么、对xmodpx \mod pxmodp的余数的限制有几个 即可
  • 再考虑 mim_imi为任意正整数 的情况:
    假设mi=∏j=1pjajm_i=\prod_{j=1}p_j^{a_j}mi=j=1pjajppp表示素数),
    则方程x≡bi(modmi)x\equiv b_i(\mod m_i)xbi(modmi)可以分解成:
    {x≡bi(modp1a1)x≡bi(modp2a2)x≡bi(modp3a3)...\begin{cases}x\equiv b_i(\mod p_1^{a_1}) \\x\equiv b_i(\mod p_2^{a_2})\\x\equiv b_i(\mod p_3^{a_3})\\...\end{cases}xbi(modp1a1)xbi(modp2a2)xbi(modp3a3)...
    那么一个方程组无解,当且仅当方程组中存在两个方程:
    x≡bi(modpa)x\equiv b_i(\mod p^a)xbi(modpa)x≡bj(modpa)x\equiv b_j(\mod p^a)xbj(modpa),且bi!=bjb_i!=b_jbi!=bj

    做法类似上面,对每个pap^apa维护 目前限制xmodpax \mod p^axmodpa的余数是什么、对xmodpax \mod p^axmodpa的余数的限制有几个 即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int pri[N],cnt,vis[N],mn[N];
int n,m[N],b[N],q;
int lim[N],tot[N],nxt[N];
//nxt[i]记录以i为区间左端点,区间右端点最右能取到哪 
struct Que{int l,r,id;friend bool operator < (Que a,Que b){return a.l<b.l;}
}que[N];
ll ans[N];
void init(){vis[0]=vis[1]=1;for(int i=2;i<=1000000;i++){if(!vis[i]){pri[++cnt]=i;mn[i]=i;}for(int j=1;j<=cnt,pri[j]*i<=1000000;j++){vis[pri[j]*i]=1;mn[i*pri[j]]=pri[j];if(i%pri[j]==0) break;}}
}
void del(int i){int tmp=m[i];while(tmp!=1){int fac=mn[tmp],pw=1;while(tmp%fac==0){tmp/=fac;pw*=fac;}for(int k=pw;k>=1;k/=fac){tot[k]--;if(!tot[k]) lim[k]=-1;}}
}
void get_nxt(){memset(lim,-1,sizeof(lim));int j=n+1;for(int i=n;i>=1;i--){int tmp=m[i];while(tmp!=1){int fac=mn[tmp],pw=1;while(tmp%fac==0){tmp/=fac;pw*=fac;}for(int k=pw;k>=1;k/=fac){if(lim[k]!=-1&&lim[k]!=b[i]%k){while(lim[k]!=-1) del(--j);}}for(int k=pw;k>=1;k/=fac){tot[k]++;if(lim[k]==-1) lim[k]=b[i]%k;}}nxt[i]=j-1;//i最右能和j-1合并 }for(int i=n-1;i>=1;i--) nxt[i]=min(nxt[i],nxt[i+1]);
}
namespace SegmentTree{ll sum[N<<2],tag[N<<2];void pushdown(int u,int l,int r){if(tag[u]){int mid=(l+r)>>1;sum[u<<1]+=tag[u]*(mid-l+1);tag[u<<1]+=tag[u];sum[u<<1|1]+=tag[u]*(r-mid);tag[u<<1|1]+=tag[u];tag[u]=0;}}void add(int u,int l,int r,int a,int b,int x){if(a<=l&&r<=b){sum[u]+=x*(r-l+1);tag[u]+=x;return;}pushdown(u,l,r);int mid=(l+r)>>1;if(a<=mid) add(u<<1,l,mid,a,b,x);if(b>mid) add(u<<1|1,mid+1,r,a,b,x);sum[u]=sum[u<<1]+sum[u<<1|1];}ll query(int u,int l,int r,int a,int b){if(a<=l&&r<=b) return sum[u];pushdown(u,l,r);int mid=(l+r)>>1;ll res=0;if(a<=mid) res+=query(u<<1,l,mid,a,b);if(b>mid) res+=query(u<<1|1,mid+1,r,a,b);return res;}
};
using namespace SegmentTree;
int main(){init();n=read();for(int i=1;i<=n;i++)m[i]=read(),b[i]=read();get_nxt();q=read();for(int i=1;i<=q;i++){que[i].l=read();que[i].r=read();que[i].id=i;}sort(que+1,que+q+1);int tmp=n+1;for(int i=q;i>=1;i--){while(tmp>1&&tmp-1>=que[i].l){tmp--;add(1,1,n,tmp,nxt[tmp],1);//以tmp~nxt[tmp]为右端点的区间都多了一个 }ans[que[i].id]=query(1,1,n,que[i].l,que[i].r);}for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2272-[ZJOI2007]最大半连通子图【tarjan,缩点】

正题 题目链接:https://www.luogu.com.cn/problem/P2272 题目大意 半连通图定义为任意两个点(u,v)(u,v)(u,v)满足uuu可以到vvv或vvv可以到uuu的有向图。 现在给出一张图&#xff0c;求最大半连通子图与其数量。 解题思路 显然一个强连通一定是一个半连通&#xff0c;所以我…

牛客网 【每日一题】5月28日题目精讲 Protecting the Flowers

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 Farmer John went to cut some wood and…

【二分】最大均值(ybtoj 二分-1-3)

最大均值 ybtoj 二分-1-3 题目大意 给出一个序列&#xff0c;让你求一个长度不小于m的子序列&#xff0c;使其平均值最大 输入样例 10 6 6 4 2 10 3 8 5 9 4 1输出样例 6500数据范围 1⩽L⩽N⩽1051\leqslant L \leqslant N \leqslant 10^51⩽L⩽N⩽105 Ai⩽2000A_i\leqs…

Steeltoe之Config客户端篇

Steeltoe是一款开源项目&#xff0c;其目标是选取源自Netflix及其它公司的工具&#xff0c;使它们能够运用于.NET社区。它不仅可以在.NET Core上&#xff0c;也可以在.NET Framework 4.X以上使用。此外&#xff0c;大多数的组件能够同时运行在本地机器及Cloud Foundry(一个领先…

[XSY] 绿色(圆方树、树形DP、树上差分)

绿色 题意简述 题解 首先&#xff0c;每次修改完点权后&#xff0c;重新考虑一遍所有路径显然是不现实的&#xff0c;所以我们考虑求出经过每个点的两端同色的简单路径数&#xff0c;这样权值和容易统计和修改。 接下来分析仙人掌上的简单路径性质。一条简单路径上的边&…

P4309-[TJOI2013]最长上升子序列【Splay】

正题 题目链接:https://www.luogu.com.cn/problem/P4309 题目大意 nnn次&#xff0c;第iii次在第xix_ixi​个数字后面插入iii然后询问最长上升子序列长度。 解题思路 因为是插入所以考虑用SplaySplaySplay维护&#xff0c;因为从小到大插入&#xff0c;其实每次就是找一个在x…

牛客网 【每日一题】5月29日 管道取珠

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 管道取珠是小X很喜欢的一款游戏。在本…

【dfs】拔河比赛(ybtoj dfs-1-1)

拔河比赛 ybtoj dfs-1-1 题目大意 给你n个数&#xff0c;让你分成两堆&#xff0c;使其数量相差不大于1&#xff0c;问数值相差最小是多少 输入样例 1 3 55 50 100输出样例 5数据范围 1⩽T⩽501\leqslant T \leqslant 501⩽T⩽50 2⩽N⩽202\leqslant N\leqslant 202⩽N⩽…

半天搭建你的Jenkins持续集成与自动化部署系统

前言相信每一位程序员都经历过深夜加班上线的痛苦&#xff01;而作为一个加班上线如家常便饭的码农&#xff0c;更是深感其痛。由于我们所做的系统业务复杂&#xff0c;系统庞大&#xff0c;设计到多个系统之间的合作&#xff0c;而核心系统更是采用分布式系统架构&#xff0c;…

牛客网 【每日一题】6月10日 失衡天平

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 终于Alice走出了大魔王的陷阱&#xff0c;可是现在傻傻…

P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/P3345 题目大意 nnn个点的一棵树&#xff0c;每次修改一个点的点权后询问一个xxx最小化∑y1ndis(x,y)∗dy\sum_{y1}^ndis(x,y)*d_yy1∑n​dis(x,y)∗dy​ 解题思路 先是构建一个点分树&#xff0c;然后考虑如何计算答案。 我…

[XSY]Illyasviel的图游戏(博弈论)

Illyasviel的图游戏 除了1号点和n号点每个点度数小于等于2&#xff0c;因此1 到 n 的所有简单路径互不相交。 在结束游戏前的最后一步一定是剩下一条 1 到 n 的路径&#xff0c;并且路径上的权值全都是1。 游戏总步数确定&#xff0c;如果剩下的最后一条路径确定了&#xff…

【dfs】数独游戏(ybtoj dfs-1-2)

数独游戏 ybtoj dfs-1-3 题目大意 给出一个未完成的数独&#xff0c;让你完成它 输入样例 4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4...... ......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3. end…

数学知识总结——矩阵

1 矩阵及其运算 由mnm\times nmn个数aija_{ij}aij​排成的mmm行nnn列的数表称为mmm行nnn列的矩阵&#xff0c;简称mnm\times nmn矩阵。记作&#xff1a; A[a11a12...a1na21a22...a2n............am1am2...amn]A\begin{bmatrix} a_{11} & a_{12} & ...&a_{1n}\\ a_…

.Net业务搭配实用技术栈

前言昨天有篇文章在讨论webform的设计思路&#xff0c;我已经四五年不用webform了&#xff0c;虽然它也提供了HttpModule和httphandle来处理请求&#xff0c;提供了一般处理程序ashx来简化处理流程&#xff0c;但依然会想起它的form runatserver&#xff0c;想起注册客户端脚本…

【dfs】虫食算(ybtoj dfs-1-3)

虫食算 ybtoj dfs-1-3 题目大意 给出一个如ABC的N进制的式子&#xff0c;现在知道某些位上的数字是相同的&#xff0c;让你求出这个式子 样例输入 5 ABCED BDACE EBBAA样例输出 1 0 3 4 2数据范围 1⩽N⩽261\leqslant N \leqslant 261⩽N⩽26 解题思路 从低位到高位枚举…

牛客网 【每日一题】6月11日题目精讲 背包

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码:题目描述 Applese有1个容量为v的背包&#xff0c;有n个物品&#xff0c;每一个物品有一个价值ai&#xff0c;以及一个大小bi 然后他对此提出了自己的疑问&#xff0c;如果我不要装的物品装的价值最大&#xff0c;只是一…

P4899-[IOI2018]werewolf 狼人【Kruskal重构树,主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P4899 题目大意 nnn个点的一张无向图&#xff0c;每次询问(s,t,l,r)(s,t,l,r)(s,t,l,r)表示询问能否找到一条s∼ts\sim ts∼t的路径使得该路径可以分割成点的序号在[l,n][l,n][l,n]和[1,r][1,r][1,r]的两段。 解题思路 首先对…

min_25筛

用途 设f(x)f(x)f(x)是一个积性函数&#xff0c;min_25筛可以在O(n34log⁡n)O(\frac{n^{\frac{3}{4}}}{\log n})O(lognn43​​)内求f(x)f(x)f(x)的前缀和&#xff1a;∑i1Nf(i)\sum_{i1}^{N}f(i)∑i1N​f(i) 使用要求&#xff1a;f(p),f(pk)f(p),f(p^k)f(p),f(pk)的值可以快速…

Service Fabric 用 Powershell 部署应用到本地

前置说明安装 Service Fabric SDK&#xff0c;会在本机 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK 生成部署脚本&#xff0c;如下图&#xff1a;用VS创建一个 Service Fabric 应用后&#xff0c;有一个部署脚本&#xff0c;位置在 [应用…