「暑期训练」「Brute Force」 Bitonix' Patrol (CFR134D1D)
题意
有n" role="presentation">nn个站点,排成圆形,每站间距m" role="presentation">mm,现从0点出发,提供t" role="presentation">tt个油箱,问:拿走若干个油箱可以让出发者无法到达任意一个站点,这样的方案有多少?(出发者可以顺时针走,也可以逆时针走)数据规模分别为:2 ≤ n ≤ 1000,1 ≤ m ≤ 120,1 ≤ t ≤ 10000" role="presentation">2 ≤ n ≤ 1000,1 ≤ m ≤ 120,1 ≤ t ≤ 100002 ≤ n ≤ 1000,1 ≤ m ≤ 120,1 ≤ t ≤ 10000
分析
本题想了好几天,看了若干个题解:
- 许昊然julao的codeforces解题报告
- https://blog.csdn.net/V5ZSQ/article/details/78949105
- 一份AC代码,不知道哪个julao写的
一并表示谢意。
首先要注意到几个个有趣的事实:对于一个容量vi" role="presentation">vivi的油箱,它的作用与vi%m" role="presentation">vi%mvi%m等效。因为题目并不要求你到达第几个站点,它只想你达不到;另外,每个容量只能带一个,不然出发者显然可以原路返回;而类似地,vi" role="presentation">vivi同m−vi" role="presentation">m−vim−vi等效。
因此,题目的规模轻易的可以降到260" role="presentation">260260。这样就可以考虑状态压缩了。设状态保存在b(bitset)中,记bi" role="presentation">bibi为真时,油量为i的油箱不可以使用(最后的解利用乘法原理计算)。那么,第j个被使用时,b转化为b|b>>>k|b<<<k" role="presentation">b|b>>>k|b<<<kb|b>>>k|b<<<k(即循环左移/循环右移)。简单说下为什么要右移:若原来第i个状态真,那么说明变为i时可以到达。那么现在必须让他达不到油箱容量i+k,才能使得出发者仍旧不能到达。
最终题目得解。
代码
#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pi = pair<int, int>;
using pii = pair<int, pi>;
const int MAXN=125;
using bst = bitset<MAXN>;
#define NDEBUG
template<typename T>
T read()
{
T tmp; cin>>tmp;
return tmp;
}
ll ans=0,mod=1000000007;
int n,m,k;
int cnt[MAXN];
inline bst mv(bst& x,int val,bool opt,int sz=m)
{
if(opt) // left
{
return (x<<val)|(x>>(sz-val));
}
else // right
{
return (x>>val)|(x<<(sz-val));
}
}
void dfs(bst nb,int n,ll mulv)
{
ans=(ans+mulv)%mod;
rep(i,n,m/2)
{
if(cnt[i] && !nb[i] && !nb[m-i])
{
dfs(nb|mv(nb,i,true)|mv(nb,i,false),i+1,mulv*cnt[i]%mod);
}
}
}
int main()
{
QUICKIO
//cin>>n>>m>>k;
scanf("%d%d%d",&n,&m,&k);
ZERO(cnt);
rep(i,0,k-1)
{
//int tmp=read<int>()%m;
int tmp; scanf("%d",&tmp);
tmp%=m;
cnt[min(tmp,m-tmp)]++;
}
bst tmp=1;
dfs(tmp,0,1);
printf("%d\n",int(ans%mod));
//cout<<ans<<endl;
return 0;
}
「暑期训练」「Brute Force」 Bitonix' Patrol (CFR134D1D)的更多相关文章
- 「暑期训练」「Brute Force」 Restoring Painting (CFR353D2B)
题意 给定一定条件,问符合的矩阵有几种. 分析 见了鬼了,这破题谁加的brute force的标签,素质极差.因为范围是1e5,那你平方(枚举算法)的复杂度必然爆. 然后你就会思考其中奥妙无穷的数学规 ...
- 「暑期训练」「Brute Force」 Multiplication Table (CFR256D2D)
题意 给定一矩阵M" role="presentation">MM,Mij=ij" role="presentation">Mi ...
- 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)
题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...
- 「暑期训练」「Brute Force」 Money Transfers (CFR353D2C)
题目 分析 这个Rnd353真是神仙题层出不穷啊,大力脑筋急转弯- - 不过问题也在我思维江化上.思考任何一种算法都得有一个“锚点”,就是说最笨的方法怎么办.为什么要这么思考,因为这样思考最符合我们的 ...
- 「暑期训练」「Brute Force」 Far Relative’s Problem (CFR343D2B)
题意 之后补 分析 我哭了,强行增加自己的思考复杂度...明明一道尬写的题- -(往区间贪心方向想了 其实完全没必要,注意到只有366天,直接穷举判断即可. 代码 #include <bits/ ...
- 「暑期训练」「基础DP」 Common Subsequence (POJ-1458)
题意与分析 很简单:求最长公共子序列. 注意子序列与子串的差别:一个不连续一个连续.一份比较好的参考资料见:https://segmentfault.com/a/1190000002641054 状态 ...
- 「暑期训练」「基础DP」免费馅饼(HDU-1176)
题意与分析 中文题就不讲题意了.我是真的菜,菜出声. 不妨思考一下,限制了我们决策的有哪些因素?一,所在的位置:二,所在的时间.还有吗?没有了,所以设dp[i][j]" role=" ...
- 「暑期训练」「基础DP」FATE(HDU-2159)
题意与分析 学习本题的时候遇到了一定的困难.看了题解才知道这是二重背包.本题的实质是二重完全背包.二维费用的背包问题是指:对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种代价:对于每种 ...
- 「暑期训练」「基础DP」 Monkey and Banana (HDU-1069)
题意与分析 给定立方体(个数不限),求最多能堆叠(堆叠要求上方的方块严格小于下方方块)的高度. 表面上个数不限,问题是堆叠的要求决定了每个方块最多可以使用三次.然后就是对3n" role=& ...
随机推荐
- 【转】DDMS中线程状态的说明
因为最近的工作中需要关注APP中的线程,在DDMS中可以查看某个应用的线程: 可以看到每个线程都有自己的status属性,那不同的status分别代表什么情况呢? running – executin ...
- HDU 3038 How Many Answers Are Wrong 【YY && 带权并查集】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 2000/1000 ...
- sougou输入法无法正常输入汉字
删除~/.config目录下的SougouPY SogouPY.users sogou-qimpanel文件夹,然后重启搜狗输入法即可
- P3393 逃离僵尸岛
P3393 逃离僵尸岛 啊.好久不写dij手都生了 这道题就是预先处理出是否是危险城市,然后跑一个最短路就行了 然后因为我感觉这个对时间要求不大紧.判断危险城市时就写了个电风扇(DFS) 然后T飞了呜 ...
- HDU 1372 Knight Moves(最简单也是最经典的bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...
- ipython notebook开通远程
之前只是会用,别人告诉我命令和大概怎么设置的,今天自己搭建才发现一知半解搞不定啊. 目的:远程通过ipython notebook调用服务器. 服务器是ubuntu16.04 本地机器win7 配置方 ...
- detection工作
今天看到YOLO2的工作还是很不错的,效果好,关键是速度也快,已经完胜SSD了感觉. 虽然faster rcnn各方面效果都不错,但是从简单粗暴的角度考虑,SSD和YOLO真的深得我心啊. 检测模型, ...
- linux下ssh/sftp配置和权限设置
基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录). 1.开通 sftp 帐号,使用户只能 sftp 操作文件, 而不能 ssh ...
- 关于math.random()的问题
今天在写一个关于随机数的小程序时,在程序执行时,发现随机数不能执行随机,随机结果始终为1. 下面贴上一开始错误的代码 int i = (int)Math.random()*3+1; 无论运行多少次,结 ...
- c#冒泡排序算法和快速排序算法
依次比较相邻的两个数,将小数放在前面,大数放在后面. 第1趟: 首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放 ...