BZOJ 2118 墨墨的等式 (同余最短路)
2024-08-30 18:18:52
题目大意:已知B的范围,求a1x1+a2x2+...+anxn==B存在非负正整数解的B的数量,N<=12,ai<=1e5,B<=1e12
同余最短路裸题
思想大概是这样的,我们选定一个最小的$ai$,让其他的数用最小的代价去拼凑取余a1之后的数,这其实可以看成求最短路的过程
想象图中有amin个点(0~amin-1),$k$和$k+ai$之间连了一条长度为ai的边,通过跑最短路的方式,尽可能得去拼凑出取余amin以后的余数的最小花费
绝对不写spfa
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
#define N 400010
#define uint unsigned int
#define inf 0x3f3f3f3f3f3f3fll
using namespace std; int n,use[N];
ll a[N],amin;
ll dis[N],bmin,bmax;
struct node{
int id;ll d;
friend bool operator<(const node &s1,const node &s2){
return s1.d>s2.d;}
node(int id,ll d):id(id),d(d){}
node(){}
};
ll dijkstra()
{
priority_queue<node>q;
memset(dis,0x3f,sizeof(dis));
dis[]=;
q.push(node(,));
while(!q.empty()){
node k=q.top();q.pop();int x=k.id;
if(use[x]) continue;use[x]=;
for(int i=;i<=n;i++){
ll v=(x+a[i])%amin;
if(dis[v]>dis[x]+a[i]){
dis[v]=dis[x]+a[i];
q.push(node(v,dis[v]));
}
}
}
} int main()
{
scanf("%d%lld%lld",&n,&bmin,&bmax);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+,a+n+);
amin=a[];
dijkstra();
ll ans=;
for(int i=;i<amin;i++){
if(dis[i]<inf&&bmax>=dis[i])
ans+=(bmax-dis[i])/amin+-((bmin--dis[i]>)?((bmin--dis[i])/amin+):); //floor
}
printf("%lld\n",ans);
return ;
}
最新文章
- Vi命令备忘
- MVC4做网站后台:栏目管理1、添加栏目-续
- spark 基本操作
- 有关sublime text的插件安装
- Three.js基本 Demo
- Shell重定向&>;file、2>;&;1、1>;&;2的区别
- [Angularjs]angular ng-repeat与js特效加载先后导致的问题
- python 批量请求url
- POJ 1743 (后缀数组 二分) Musical Theme
- xslt语法之---基础语法
- SPM HW1 A project
- springboot情操陶冶-jmx解析
- 20172328 暑假作业 之 实现安卓小程序Enjoy-all
- 动态规划——Valid Permutations for DI Sequence
- 5 第一个Django第4部分(表单和通用视图)
- Python拆分DataFrame
- 【数据结构】约瑟夫问题 C语言链表实现
- Jira客户端
- 解题2(IpIsSameSubNet)
- Hexo之部署github