首页 > 其他分享 >P2371 [国家集训队] 墨墨的等式

P2371 [国家集训队] 墨墨的等式

时间:2023-08-22 19:33:38浏览次数:178  
标签:int sum P2371 long vis 墨墨 等式 国家集训队 dis

题目大意

对于等式 \(\displaystyle\sum_{i=1}^{n}a_ix_i=b\) 求有多少 \(b\in [l,r]\) 使得等式存在非负数解。

思路

典型的同余最短路,可先看看跳楼机题解)。

首先想到将区间 \([l,r]\) 分开,分为 \([0,l-1]\) 和 \([0,r]\) 再答案相减。

所以我们只需要能求得 \([0,x]\) 的答案即可。

若 \(\displaystyle\sum_{i=1}^{n}a_ix_i=t\),设其中一个 \(a_i\) 为 \(k\) ,那么 \(\displaystyle\sum_{i=1}^{n}a_ix_i=t+k\times l,l\in \mathbb{N}\)。发现 \(k\) 越小,\(b\) 可能的值越多,所以我们直接取最小的 \(a_i\) 为 \(k\)。

令 \(dis_i\) 代表 \(b\%k=i\) 时的最小值。

然后我们就可以连边 \(i->(a_j+i)\%k\),边权为 \(a_j\)。代表要从 \(i\) 变到 \((a_j+i)\) 需要加一个 \(a_j\)。因为 \(dis_i\) 的定义,所以需要模一遍 \(k\)。

其实在程序中,我们不需要建边,可以直接根据 \(a_j\) 计算更新即可。

跑一遍最短路后,我们发现对于答案模 \(k\) 是 \(i\) 的情况中,最小也是 \(dis_i\),若 \(dis_i\) 小于 \(x\) 则代表有解,且对于所有的 \(dis_i+k\times l,l\in \mathbb{N}\) 都是答案,所以在区间 \([0,x]\) 中满足情况的有 \(\lfloor \frac{x-dis_i}{k}\rfloor+1\) 个。

对于每个 \(dis_i\),我们只需要求得在 \([0,l-1]\) 和 \([0,r]\) 的解个数,然后相减就可以得到 \([l,r]\) 的解个数,再把每个 \(dis_i\) 求得的解个数加起来就是所有的可能值。

AC 代码

#include<bits/stdc++.h>
using namespace std;
const long long inf=0x3f3f3f3f3f3f3f3f;
long long n,l,r,a[20],k=inf,dis[500005],ans;
queue<int>q;
bool vis[500005];
inline void spfa(int s)//关于spfa,他没有死
{
	memset(dis,0x3f,sizeof(dis)),dis[s]=0,q.push(s),vis[s]=1;//初始化
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=1;i<=n;++i)//不需要建图,根据定义直接找到链接的下一个点
		{
			int j=(u+a[i])%k;
			if(dis[j]>dis[u]+a[i])
			{
				dis[j]=dis[u]+a[i];
				if(!vis[j]) q.push(j);
				vis[j]=1;
			}
		}
		vis[u]=0;
	}
}
int main()
{
	scanf("%lld%lld%lld",&n,&l,&r);
	for(int i=1;i<=n;++i) scanf("%lld",&a[i]),k=min(k,a[i]);//读入的时候顺便找到最小的a[i]
	spfa(0);
	for(int i=0;i<k;++i) if(dis[i]!=inf) dis[i]-=i,dis[i]/=k,ans=ans-max(0ll,(l-1-i)/k-dis[i]+1)+max(0ll,(r-i)/k-dis[i]+1);//分别计算[0,l-1]和[0,r]的值,需要注意dis[i]小于x的情况,这种情况答案是0,所以需要max一遍
	printf("%lld",ans);
	return 0;
}

标签:int,sum,P2371,long,vis,墨墨,等式,国家集训队,dis
From: https://www.cnblogs.com/One-JuRuo/p/17649488.html

相关文章

  • Tarjan 例题:洛谷P1407 [国家集训队] 稳定婚姻
    在洛谷中查看题意:自己读一下,大致就是\(2n\)个点,每个点编号为\(1-2n\),\(\lfloor编号/2\rfloor\)相同的点连条边。然后再给\(m\)条边。问:将每个\(\lfloor编号/2\rfloor\)相同的点间连的边断开,还能不能使每个编号为奇数的点都有一个编号为偶数的点对应。这个......
  • 题解 [国家集训队] 稳定婚姻
    题目链接首先我们考虑用图论的边描述这个关系。若两者存在夫妻或情侣关系,就连一条边(是有向边还是无向边呢?)。先来考虑两对夫妻的情况,若夫妻边与情侣边交替出现。且一对夫妻在同一个环内,则可以说明分开后能够重新找到另一半。如下图:夫妻a-男b-女c-男d-女情侣a-男d-女c-......
  • [国家集训队] Tree II 题解报告
    [国家集训队]TreeII一道·真·板子·题就是练习LCT懒标记的题目除了翻转标记以外还要维护乘法标记和加法标记注意加法标记和乘法标记的维护!!!加法标记因为splay的区间大小不是固定的,所以我们要维护size,并且子树的sum要加上size乘上标记其他的就只用直接加上即可voidpusha......
  • 题解 P2839【[国家集训队] middle】
    Problem一个长度为\(n\)的序列\(a\),设其排过序之后为\(b\),其中位数定义为\(b_{n/2}\),其中\(a,b\)从\(0\)开始标号,除法下取整。给你一个长度为\(n\)的序列\(s\)。回答\(Q\)个这样的询问:\(s\)的左端点在\([a,b]\)之间,右端点在\([c,d]\)之间的子区间中,最大的中......
  • 国家集训队论文
    2021陈雨昕《太阳神的宴会》命题报告代晨昕后缀树的构建邓明扬一类调整算法在信息学竞赛中的应用可能有交丁晓漫再探线性规划对偶在信息学竞赛中的应用...郭城志浅谈信息学竞赛中的弦图问题......
  • P1903 [国家集训队] 数颜色 / 维护队列 题解
    一、题目描述:给你一个长度为$n$的序列$a$,你需要进行$m$次操作。$类型\1\:将第\x\个元素的值修改为\v\。$$类型\2\:求区间\l\到\r\中有多少种数字。$数据范围:$1\len,m\le1333333,所有数字\le1\times10^6$ 二、解题思路:带......
  • P4451 [国家集训队]整数的lqp拆分
    Description求\[\begin{aligned}&\sum\prod_{i=1}^mF_{a_i}\\&m>0\\&a_1,a_2\ldotsa_m>0\\&a_1+a_2+\ldots+a_m=n\end{aligned}\]由于答案可能非常大,所以要对\(10^9+7\)取模。Solution题目中有整数拆分的部分,可以想到用生成函数的相关知识。设斐波那契数......
  • Luogu P1903 [国家集训队] 数颜色 / 维护队列
    题目来源https://www.luogu.com.cn/problem/P1903[国家集训队]数颜色/维护队列题目描述墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:\(Q\L\R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种......
  • 【题解】P4464 [国家集训队] JZPKIL
    仙气飘飘莫反题。显现出了很多推式子习惯的问题。思路莫反+伯努利数+Pr。首先根据\(\operatorname{lcm}(x,y)=\frac{xy}{\gcd(x,y)}\)可以化简:\(\sum\limits......
  • P1829 [国家集训队]Crash的数字表格 / JZPTAB
    [国家集训队]Crash的数字表格/JZPTAB这个题可以低于线性,然后也可以杜教筛到\(O(n^{2/3})\)这个样子。首先暴力推:\[\begin{aligned}&\sum_{i=1}^{n}\sum_{j=1}^{......