1和2操作是独立的,换言之一定可以先执行1操作选择包裹,再执行2操作使得$0\le c_{i}<2i$

对于$c_{i}$,将其看作一个进制转换,并以$c_{i}$为从低到高的第$i$位,系数即为$2^{i-1}(i-1)!$

将其乘权累加,即令$c_{0}=\sum_{i=1}^{n}2^{i-1}(i-1)!c_{i}$,考虑2操作对$c_{0}$的影响:

1.对于$i$($1\le i<n$)的操作,显然不会改变$c_{0}$

2.对于$n$的操作,即将$c_{0}$减去$2^{n}n!-1$(以下记作$N$)

根据最终$0\le c_{i}<2i$,代入即得到最终的$c'_{0}$满足
$$
c'_{0}\le \sum_{i=1}^{n}(2i-1)2^{i-1}(i-1)!=\sum_{i=1}^{n}2^{i}i!-\sum_{i=1}^{n}2^{i-1}(i-1)!=N
$$
1.对于$c_{0}\not\equiv 0(mod\ N)$的情况,$c'_{0}$一定是$c_{0}$对$N$取模的结果

2.对于$c_{0}\equiv 0(mod\ N)$的特殊情况下,则$c'_{0}=0或N$,由于初始以及任意一次操作后都会有$\sum_{i=1}^{n}c_{i}>0$,即$c'_{0}\ne 0$,因此$c'_{0}=N$

进一步的,确定最终的$1\le c'_{0}\le N$后,根据$0\le c_{i}<2i$,我们也可以从高到低依次确定$c_{i}$,那么也就是说我们仅关心于最终能产生哪些$c'_{0}$

更具体的,令$c_{0}=\sum_{i=1}^{n}2^{i-1}(i-1)!c_{i}$,$s_{i}=\sum_{j=1}^{n}2^{j-1}(j-1)!s_{i,j}$,观察式子可以发现每一项对应相加即为整体相加,因此取第$i$个包裹即令$c_{0}+=s_{i}$(模$N$意义下相加)

每一次都是加上$s_{i}$或减去$N$(模$N$),根据扩欧,有$c'_{0}\equiv c_{0}(mod\ \gcd(N,s_{1},s_{2},...,s_{n}))$,同时可以构造出一组整数解(不保证$s_{i}$系数非负且$N$系数非正),通过这组解,不断令$s_{i}$的系数加上$N$、$N$的系数减去$s_{i}$使其满足上面的两个条件,因此都是可以的

令$d=\gcd(N,s_{1},s_{2},...,s_{n})$,来考虑两种做法:

1.暴力枚举所有$c'_{0}$(要求$1\le c'_{0}\le N$)并构造出对应$c_{i}$,然后求出答案,这一做法复杂度为$o(\frac{nN}{d})$

2.先来构造最终的$c_{i}$,即要使得$\sum_{i=1}^{n}2^{i-1}(i-1)!c_{i}\equiv c_{0}(mod\ d)$

这个可以看作从$c_{i}=\{0,0,...,0\}$开始,将其中某一个$c_{i}$加1,移动到另一个点,由于我们仅关心于其模$d$的余数,因此可以看作一个大小为$d$的图,bfs即可,时间复杂度为$o(nd)$

(当$c_{0}\equiv 0(mod\ d)$时需要特判,因为不能令$c_{i}=\{0,0,...,0\}$)

由此,我们得到了一个$o(n\sqrt{N})$的做法,但复杂度似乎还不能接受

注意到$N=2^{n}n!-1$,$d$必然是其因子,而由于$N$形式的特殊性,打表可得
$$
\max_{2\le n\le 16,N=2^{n}n!-1,d|N}n\min(\frac{N}{d},d)\le 14577924
$$
(最大值是在$n=12$时取到,$d=1214827$)

上面这个式子即复杂度,那么就可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 #define oo 0x3f3f3f3f
5 queue<int>q;
6 vector<int>dis;
7 int n,m,x,ans;
8 ll N,d,c,val[21];
9 ll gcd(ll x,ll y){
10 if (!y)return x;
11 return gcd(y,x%y);
12 }
13 int main(){
14 scanf("%d%d",&n,&m);
15 val[1]=1;
16 for(int i=2;i<=n;i++)val[i]=2*(i-1)*val[i-1];
17 d=N=2*n*val[n]-1;
18 for(int i=1;i<=n;i++){
19 scanf("%d",&x);
20 c+=x*val[i];
21 ans+=x;
22 }
23 for(int i=1;i<=m;i++){
24 ll s=0;
25 for(int j=1;j<=n;j++){
26 scanf("%d",&x);
27 s+=x*val[j];
28 }
29 d=gcd(d,s);
30 }
31 if (d>N/d){
32 for(ll i=c%d;i<=N;i+=d){
33 if (!i)continue;
34 ll k=i;
35 int s=0;
36 for(int j=n;j;j--){
37 s+=k/val[j];
38 k%=val[j];
39 }
40 ans=min(ans,s);
41 }
42 printf("%d",ans);
43 return 0;
44 }
45 for(int i=0;i<d;i++)dis.push_back(oo);
46 dis[0]=0;
47 q.push(0);
48 while (!q.empty()){
49 int k=q.front();
50 q.pop();
51 for(int i=1;i<=n;i++)
52 if (dis[(k+val[i])%d]==oo){
53 dis[(k+val[i])%d]=dis[k]+1;
54 q.push((k+val[i])%d);
55 }
56 }
57 if (c%d)printf("%d",dis[c%d]);
58 else{
59 for(int i=1;i<=n;i++)ans=min(ans,dis[(N-val[i])%d]+1);
60 printf("%d",ans);
61 }
62 }

[atARC112F]Die Siedler的更多相关文章

  1. No zuo no die:DDD 应对具体业务场景,Domain Model 重新设计

    写在前面 上联:no zuo no die why you try 下联:no try no high give me five 横批: let it go上联:no zuo no die why y ...

  2. Also unsere eigene Christian Louboutin Webshop bietet die überragende Christian Louboutin Schuhe uk schiebt zusammen mit kostengünstigen Wert

    www.heelschuhe.de, Es ist wirklich eine der Frauen erfordern immer interessant und auch Louboutin Pu ...

  3. php的exit和die

    首先, 两者是相等的: exit is equivalent to die; 其次, 都是语言构造器, language construct. 不是函数! 后面的内容用括号括起来只是为了方便... 用 ...

  4. IE6 Must Die

    最近 Twitter 上很多人在推一个名为 IE6 Must Die 的活动, 参与的朋友可以通过头像转换服务在自己的头像上加上一个禁止 IE6 的图标, 很是拉风. Internet Explore ...

  5. (译)开发优秀的虚拟现实体验:从开发I Expect You to Die中总结的六个要点

    这篇文章是我从网上找来的,我觉得他非常详细的解释了VR发展的需求和必要.我认为通过这篇文章可以让大家了解VR. 译者写在最前: 来到追光动画有好几个月了,抱歉这段时间也没有什么文章与大家分享,我现在在 ...

  6. @错误抑制运算符和or die()

    1.错误抑制运算符可在任何表达式前使用,PHP支持一个错误抑制运算符@.当将其放置在一个PHP表达式之前,则该表达式可能产生的任何错误信息都被忽略掉.@运算符只对表达式有效. 2.or die() 当 ...

  7. return,exit,die

    return:代表退出某个函数,但是函数体外的语句仍然需要执行. exit:退出程序,但是不从内存中卸载,exit其实也是可以输出语句的,加一个括号即可. die:退出程序,并且从内存中卸载.

  8. UVa657 The die is cast

    // 题意:给一个图案,其中'.'表示背景,非'.'字符组成的连通块为筛子.每个筛子里又包含两种字符,其中'X'组成的连通块表示筛子上的点 // 统计每个筛子里有多少个"X"连通块 ...

  9. Codeforces Beta Round #51 C. Pie or die 博弈论找规律 有趣的题~

    C. Pie or die Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/problem/ ...

随机推荐

  1. 10.6.2 sendfile

    1.传统Linux中 I/O 的问题 2.传统的 Linux 系统的标准 I/O 接口( read. write)是基于数据拷贝的,也就是数据都是 copy_to_user 或者 copy_from_ ...

  2. 初探区块链数字加密资产标准ERC721

    ERC721介绍 数字加密货币大致可以分为原生币(coin)和代币(token)两大类.前者如BTC.ETH等,拥有自己的区块链.后者如Tether.TRON.ONT等,依附于现有的区块链.市场上流通 ...

  3. bzoj2242,洛谷2485----SDOI2011计算器(exgcd,qsm,bsgs模板)

    就是一道模板题! 这里再强调一下 BSGS 考虑方程\(a^x = b \pmod p\) 已知a,b,p\((2 \le p\le 10^9)\),其中p为质数,求x的最小正整数解 解法: 注意到如 ...

  4. Billu_b0x2内网渗透(多种提权方法)靶场-vulnhub

    个人博客阅读体验更佳 本次来试玩一下vulnhub上的Billu_b0x2,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶场推荐使用N ...

  5. DM8数据库单机安装

    一.系统概要 表1 部署情况一览表 操作系统 Windows10 数据库版本 DM8(开发版) 数据库类型 单机 磁盘挂载 无 Key信息 无 二.操作系统信息检查 2.1 操作系统版本 [root@ ...

  6. 剑指offer:JZ12 矩阵中的路径

    JZ12 矩阵中的路径 描述 请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上, ...

  7. Java:AQS 小记-1(概述)

    Java:AQS 小记-1(概述) 概述 全称是 Abstract Queued Synchronizer(抽象队列同步器),是阻塞式锁和相关的同步器工具的框架,这个类在 java.util.conc ...

  8. Java:NIO 学习笔记-1

    Java:NIO 学习笔记-1 说明:本笔记是根据bilibili上 尚硅谷 的课程 NIO视频 而做的笔记 主要内容 Java NIO 简介 Java NIO 与 IO 的主要区别 缓冲区(Buff ...

  9. linux系统上国际化失败

    文章目录 一.需求: 二.出现的问题 三.代码结构 1.配置文件中的配置 2.java代码中的使用 四.解决方案 一.需求: 最近项目中有这么一个需求,当用户当前的语言环境是 中文时,导出的 exce ...

  10. advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)

    <高级Bash脚本编程指南>Revision 10中文版 github上链接地址: https://github.com/LinuxStory/Advanced-Bash-Scriptin ...