博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ2118/Luogu2371][国家集训队]墨墨的等式
阅读量:5076 次
发布时间:2019-06-12

本文共 1137 字,大约阅读时间需要 3 分钟。

题目链接:

数论(×

背包(×

暴搜(×

结论(×

图论(√

惊 不 惊 喜 意 不 意 外

显然,答案可以转化为\(Ans[1,B_{Max}]-Ans[1,B_{Min}-1]\),现在思考怎么计算\(Ans[1,Lim]\)

首先,若能够组成\(k*a_i+x(0\le x<a_i,k\in\mathbb{N})\),那么\(l*a_i+x(l>k)\)也可以组成。

若能对每一个\(x\)求出最小的\(k*a_i+x\),那么就可以轻松地计算有多少\(l\)满足\(l*a_i+x\le Lim\)

怎么计算?Dijkstra

\(0\sim a_i-1\)\(a_i\)个点,表示对应\(x\)下最小的\(k*a_i+x\),在剩余系跑一遍最短路即可。

\(a_i\)当然选最小的那个啊~~

时间复杂度 \(O(na_ilog_2(na_i))\)

代码:

#include 
#include
#include
#include
typedef long long ll;int n,a[15],Mina=1e9;ll BMin,BMax,Dis[500005];struct Rec{ int p; ll d; inline bool operator<(const Rec &o)const {return d>o.d;}};void Dijkstra(){ std::priority_queue
q; memset(Dis,0x3f,sizeof Dis); q.push((Rec){0,Dis[0]=0}); while(!q.empty()) { int x=q.top().p; ll d=q.top().d; q.pop(); if(d!=Dis[x])continue; for(int i=1,y;i<=n;++i) if(Dis[y=(x+a[i])%Mina]>d+a[i]) q.push((Rec){y,Dis[y]=d+a[i]}); }}ll Query(const ll x){ ll Res=0; for(int i=0;i

转载于:https://www.cnblogs.com/LanrTabe/p/10506573.html

你可能感兴趣的文章
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
[ZJOI2007]棋盘制作 【最大同色矩形】
查看>>
IOS-图片操作集合
查看>>
模板统计LA 4670 Dominating Patterns
查看>>
团队项目开发客户端——登录子系统的设计
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
session如何保存在专门的StateServer服务器中
查看>>
react展示数据
查看>>
测试计划
查看>>
选择器
查看>>
Mysql与Oracle 的对比
查看>>
jquery实现限制textarea输入字数
查看>>
thinkphp5 csv格式导入导出(多数据处理)
查看>>
PHP上传RAR压缩包并解压目录
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>