无损加密

题目描述


题解

首先,我们可以把求行列式的条件转化一下。
一种经典的行列式转化方式就是LGVLGVLGV引理,将我们的行列式转化成不想交路径的方案数。
显然,我们每次的转移相当于乘上一个ai,j=[i=j∨lk⩽i<j⩽rk]a_{i,j}=[i=j\vee l_k\leqslant i< j\leqslant r_k]ai,j​=[i=j∨lk​⩽i<j⩽rk​]的矩阵。
我们尝试把它转化成图。
我们最开始的出发点相当于是1,2,3,...,n1,2,3,...,n1,2,3,...,n,我们的终点是1,2,3,...,m1,2,3,...,m1,2,3,...,m,最开始是这个样子的,借用一下crashed\rm crashedcrashed的图:

原矩阵的乘ddd相当于就是从这个点到下一个点的边权为ddd。同样,横着也相当于每走一步就要乘ccc。
所以我们最后建出的图大概是这个样子的:

我们考虑怎么计算这个的总方案数。
由于ri−li+1⩽sr_i-l_i+1\leqslant sri​−li​+1⩽s,所以我们可以知道每一列上的入度与出度都是⩽s\leqslant s⩽s的。
我们可以考虑一列一列地状压转移。
首先我们的转移是要求点不交的,我们每次就相当对于当前在这一列上覆盖到的入点,转移到其对应的出点,时间复杂度是O(m22s)O\left(m2^{2s}\right)O(m22s)的。

由于点不交,其实我们可以预处出来当前状态的每个点转移到的目标点有哪些,这样按道理来说会快一些,不过还是过不了。
更加经典的方法是可以用类似高维前缀和的方法进行转移。
先把所有的入点都映射到它后面的第一个出点上,显然它是至少要走到这个点上的。如果有点映射到了同一个点上,那肯定是不行的了。
之后,我们再考虑在每一个出点上的点是否转移到接下来的一个出点上面,一条边一条边地进行转移。显然,只有当这个点与下一个点都有是才不能转移。
由于我们是从上往下转移的,所以上一个点的终末位置时不会超过下一个点的初始位置,所以它们是合法的。
我们当这一列都赚完了后,再从这个出点转移到下一个入点,这只需要把每个状态的编号换到下一个状态上就行了。
注意就是从这一列的最后一个点是可以从这一列的末尾走出去的。

总时间复杂度O(q2s)O\left(q2^s\right)O(q2s)。

源码

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
typedef unsigned int uint;
#define MAXN 200005
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
const LL INF=0x3f3f3f3f3f3f3f3f;
const int mo=1e9+7;
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1)t=1ll*a*t%p;a=1ll*a*a%p;s>>=1;}return t;}
int n,m,Q,ans,now,las;
int degin[MAXN],degout[MAXN],dp[2][605];
int sta[30],stak,ip[30];
vector<int>vin[MAXN],vout[MAXN],vec[MAXN];
struct ming{int l,r,c,d;ming(){l=r=c=d=0;}ming(int L,int R,int C,int D){l=L;r=R;c=C;d=D;}
}s[MAXN*10];
struct tann{int id,s,nw;tann(){id=s=nw=0;}tann(int I,int S,int N){id=I;s=S;nw=N;}
};
queue<tann>q;
int main(){freopen("encode.in","r",stdin);freopen("encode.out","w",stdout);read(n);read(m);read(Q);bool fg=0;int summ=1;for(int i=1;i<=Q;i++){int l,r,c,d;read(l);read(r);read(c);read(d);s[i]=ming(l,r,c,d);fg|=(c>1||d>1);summ=1ll*d*summ%mo;for(int j=l+1;j<=r;j++)vin[j].pb(i),degin[j]++;for(int j=l;j<r;j++)vout[j].pb(i),degout[j]++;}now=0;las=1;dp[0][0]=1;for(int i=1;i<=m;i++){int szin=vin[i].size(),szot=vout[i].size();stak=0;if(i<=n){sta[stak++]=0;swap(now,las);for(int j=0;j<(1<<degin[i]);j++)dp[now][j<<1|1]=dp[las][j],dp[las][j]=0;}for(int j=0;j<szin;j++)sta[stak++]=vin[i][j];for(int j=stak-1,k=szot;j>=0;j--){while(k>0&&vout[i][k-1]>=sta[j])k--;ip[j]=k;}swap(now,las);for(int S=0;S<(1<<stak);S++)if(dp[las][S]){int nS=0,ls=-1;bool flag=0;for(int j=0;j<stak;j++)if((S>>j)&1)nS|=(1<<ip[j]),flag|=(ls==ip[j]),ls=ip[j];if(!flag)Add(dp[now][nS],dp[las][S],mo);dp[las][S]=0;}stak=0;for(int j=0;j<szot;j++)sta[stak++]=vout[i][j];sta[stak++]=Q+1;for(int j=0;j<stak-1;j++){swap(now,las);int nS=(1<<j)|(1<<j+1);for(int k=0;k<(1<<stak);k++)if(dp[las][k]){int tp=dp[las][k];dp[las][k]=0;Add(dp[now][k],tp,mo);if((k&nS)==(1<<j))Add(dp[now][k^nS],tp,mo);}}swap(now,las);for(int S=0;S<(1<<stak);S++)if(dp[las][S]){int tmp=dp[las][S],T=0;dp[las][S]=0;for(int k=0;k<stak-1;k++)if((S>>k)&1)tmp=1ll*s[sta[k]].c*tmp%mo,T|=(1<<k);Add(dp[now][T],tmp,mo);}}printf("%lld\n",1ll*qkpow(summ,n,mo)*dp[now][0]%mo);return 0;
}

谢谢!!!

[航海协会]无损加密相关推荐

  1. 加州注册会计师协会推动加密货币会计准则明确性

    点击上方"蓝色字"可关注我们! 暴走时评:加利福尼亚州注册会计师协会正在推动明确有关加密货币的会计和披露规则,理由是美国公认会计准则(GAAP)中缺乏针对加密货币的具体指导,GAA ...

  2. 【2022国赛模拟】无损加密——LGV引理、状压DP

    原创题无来源 题目描述 题解 首先把问题稍作简化,我们可以最后把行列式乘上所有 dkd_kdk​ 的积的 nnn 次方,这样前面的过程就不用考虑 dkd_kdk​ 了,暴力也只需要变动 [lk,rk] ...

  3. 网络安全和支付 讲解

    1.所有的加密以及编码: 1.base64编码,方便网络传输数据,不丢失,它只是编码,不属于加密. 2.有损加密:比如md5 ,sha1.这些都是不可逆的.他们一般用来确保某一个文件的唯一性. 3.无 ...

  4. [转]信息安全相关理论题(二)

    27.在工程实施之前,验收方可以不给施工方弱电布线图纸,但施工结束后必须有图纸 A. 对 B. 错 您的答案: 标准答案: B 28.在OSI七层协议中,提供一种建立连接并有序传输数据的方法的层是 A ...

  5. qq家园文字版二战风云的建筑类型

    最近开发完了当年qq家园文字版的二战风云,记录下二战风云文字版的建筑类型 军事区:市政厅,围墙,军校,司令部,参谋部,轻工厂,重工厂,停机坪,航海协会,联络中心,军工厂,民居 资源区:农田,炼钢厂,石 ...

  6. 一些关于船舶撞桥的数据

    根据各种有关资料文献的介绍, 船撞桥事故在世界各地一直在不断地发生, 船撞桥事故的频率远比我们想象的更经常.由船撞桥事故所导致的人员伤亡.财产损失以及环境破坏是惊人的.很多船撞桥事故轻则损失数万元, ...

  7. 【ELT.ZIP】OpenHarmony啃论文俱乐部——综述视角解读压缩编码

    ---本文出自 ELT.ZIP团队,ELT<=>Elite(精英),.ZIP为压缩格式,ELT.ZIP即压缩精英. 成员:上海工程技术大学大二在校生            合肥师范学院大二 ...

  8. 数字加密c语言程序_大厂程序员整理的 C++ 资源大全,不私藏了,都送给你们吧...

    关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz 发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 1.标准库 C++标准库,包括 ...

  9. 国际互联网协会(ISOC)提出未来互联网十项原则

    来源:腾讯研究院 此前,国际互联网协会(Internet Society,简称ISOC)发布了题为<通往数字化未来之路(Paths to Our Digital Future)>的报告,就 ...

最新文章

  1. java instanceof 报错_java instanceof方法
  2. 记录一下python-opencv-ArUco-Apriltag
  3. 预习一下计算机网络分类,计算机网络实验预习报告1
  4. 公共无线网络多陷阱 ***称15分钟盗银行账号密码
  5. 属于attribute还是property。
  6. 设计模式—单例模式(思维导图)
  7. MagicAjax的用法, 每10秒刷新, 更改等待loading效果
  8. swift1.2新增和改动
  9. tp5 生成二维码并与背景图合并
  10. c语言开发 kdj,KDJ——随机指标之王
  11. 想知道如何批量压缩图片?来试试这几个图片压缩工具
  12. 全自动过滤器:全自动自清洗过滤器对给排水总结的经验
  13. 记录Flutter安装使用过程
  14. 浏览器内多个标签页之间的通信方式有哪些?
  15. Hadoop2.x与3.x的区别:
  16. 推荐算法工程师面试准备
  17. Android Vibrator(震动服务)
  18. JAVA外包服务的整体工作流程有哪些
  19. Web前端开发的就业前景怎么样,薪资待遇如何
  20. SaltStack常用模块——file

热门文章

  1. Flask教程(一)
  2. 常见的MySQL优化方案1
  3. xp下对dinput8.dll 游戏键盘输入的模拟 非函数hook
  4. istio-cni详解
  5. 根据财务指标的量化交易策略
  6. Verilog在编写第一行代码之前
  7. 2021 ICPC 四川省赛 L - Spicy Restaurant(多源BFS,DP)
  8. mysql数据库的行级锁有几种_数据库行级锁和表锁区别
  9. 对参考文献格式的一些举例
  10. OpenJ_Bailian - 2943小白鼠排队