博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「暑期训练」「Brute Force」 Bitonix' Patrol (CFR134D1D)
阅读量:5264 次
发布时间:2019-06-14

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

题意

nn个站点,排成圆形,每站间距mm,现从0点出发,提供tt个油箱,问:拿走若干个油箱可以让出发者无法到达任意一个站点,这样的方案有多少?(出发者可以顺时针走,也可以逆时针走)数据规模分别为:2n1000,1m120,1t100002 ≤ n ≤ 1000,1 ≤ m ≤ 120,1 ≤ t ≤ 10000

分析

本题想了好几天,看了若干个题解:

  • 许昊然julao的codeforces解题报告
  • 一份AC代码,不知道哪个julao写的

一并表示谢意。

首先要注意到几个个有趣的事实:对于一个容量vivi的油箱,它的作用与vi%mvi%m等效。因为题目并不要求你到达第几个站点,它只想你达不到;另外,每个容量只能带一个,不然出发者显然可以原路返回;而类似地,vivimvim−vi等效。

因此,题目的规模轻易的可以降到260260。这样就可以考虑状态压缩了。设状态保存在b(bitset)中,记bibi为真时,油量为i的油箱不可以使用(最后的解利用乘法原理计算)。那么,第j个被使用时,b转化为b|b>>>k|b<<<kb|b>>>k|b<<<k(即循环左移/循环右移)。简单说下为什么要右移:若原来第i个状态真,那么说明变为i时可以到达。那么现在必须让他达不到油箱容量i+k,才能使得出发者仍旧不能到达。
最终题目得解。

代码

#include 
#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
;using pii = pair
;const int MAXN=125;using bst = bitset
;#define NDEBUGtemplate
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<
>(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
()%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<
<

转载于:https://www.cnblogs.com/samhx/p/9652049.html

你可能感兴趣的文章
PAT——1060. 爱丁顿数
查看>>
分布式技术追踪 2017年第二十期
查看>>
git添加公钥后报错sign_and_send_pubkey: signing failed: agent refused operation的解决办法
查看>>
Linux环境变量永久设置方法(zsh)
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>
脑袋卡在窗子里
查看>>
ruby 中文字符to_json后乱码(unicode)
查看>>
《大道至简》第六章读后感
查看>>
codeforce 597C-Subsequences(dp+树状数组)
查看>>
[android](学习笔记6)为应用程序添加对话框(1)
查看>>
windows下mongodb安装与使用
查看>>
rotate the clock
查看>>
bugku 变量
查看>>
Python 环境傻瓜式搭建 :Anaconda概述
查看>>
数据库01 /Mysql初识以及基本命令操作
查看>>
数据库02 /MySQL基础数据类型以及多表之间建立联系
查看>>
Python并发编程04/多线程
查看>>
CF461B Appleman and Tree
查看>>
CF219D Choosing Capital for Treeland
查看>>
杂七杂八的小笔记本
查看>>