AtCoder Grand Contest 019E: Shuffle and Swap 题解

基于IMX429-IMX430-IMX432-IMX437系列传感器的SLVS-MIPI桥接方案设计与实现 本文详细介绍了针对索尼IMX429、IMX430、IMX432及IMX437系列传感器的SLVS-MIPI桥接方案设计与实现。针对工业视觉、车载摄像头等应用中主流SoC仅支持MIPI接口的痛点,提出基于FPGA(如Lattice Crosslink-NX)的透传桥接方案,将传感器输出的SLVS信号无损转换为MIPI CSI-2信号,确保数据完整性与低延迟,并探讨了硬件选型、逻辑设计及多传感器兼容性等关键问题。 阅读详情

非常好的dp+组合题
这个版本的做法参考了tourist的editorial
我们不考虑两个序列的random shuffle,而是考虑这样的两个操作
1. 确定a序列和b序列的匹配方法
2. 确定这些匹配方法的出现顺序
我们考虑a序列和b序列匹配好以后,在A序列里面每个ai向bi连一条有向边
我们发现A序列的每个位置只有三种情况
1. 有某个a对应没有b对应,这样这个点只有出边
2. 由某个a对应也有某个b对应,这样这个点有入边也有出边
3. 没有a对应有某个b对应,这样这个点只有入边
设1类点有e个,2类点有m个,因为A和B中1的个数相等,所以3类点也有e个
考虑这个图本身,我们发现这个图一定是若干个环和若干个链组成的
我们发现组成环的这些位置所对应的A序列中的位置的数一定都是1,所以环当中边出现的顺序是任意的
我们发现链中匹配边出现的顺序有且只有一种,因为一条链中对应的A序列中的值,只有链尾是0,其他都是1,对应B序列中只有链头是0,其他都是1,所以边
一定要按照从后向前的顺序出现
环中的点都是2类点,链头和链尾都是1类和3类点,链中间的点是2类点
我们考虑怎样把2类点分到e条链和若干个环中
令dp[i][j]表示已经考虑到将j个点放入i条链的方案数,dp[i][j]=∑jk=0dp[i−1][k](j−k+1)!dp[i][j]=∑k=0jdp[i−1][k](j−k+1)!(分母上的阶乘的意义在后面解释)
最后把dp[e][0~m]的答案加起来,再乘上e!∗m!∗(e+m)!e!∗m!∗(e+m)!
e!指e条链的链头和链尾配对,有e!种配对方法
m!指m个2类点的连接顺序,比如说一条链的点确定了,但这条链的连法有阶乘种
我们还要考虑边的出现顺序,所有的出现顺序是(e+m)!但是每条链的出现顺序只有一种所以要除以若干个(u+1)!,这个在算dp的时候已经除过了
这样就有了一个O(n3)O(n3)的做法
考虑优化
我们发现dp的转移方程是一个卷积的形式,k+(j-k+1)=j+1,所以每层的转移可以NTT优化,复杂度降到O(n2logn)O(n2logn)
然后我们发现每次乘的多项式都是一样的,都是f(x)=∑mi=0xi(i+1)!f(x)=∑i=0mxi(i+1)!,所以可以快速幂+NTT,复杂度O(nlog2n)O(nlog2n)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=998244353;
const LL LINF=2e16;
const int INF=1e9;
const int magic=348;
const double eps=1e-10;
const double pi=3.14159265;
const int G=3;

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

int inv[200048];
LL finv[200048],fac[200048];
int n;
char s1[100048],s2[100048];
int e,m;

inline void init_inv()
{
    int i;
    fac[0]=fac[1]=inv[0]=inv[1]=finv[0]=finv[1]=1;
    for (i=2;i<=100000;i++)
    {
        fac[i]=(fac[i-1]*i)%MOD;
        inv[i]=MOD-((long long)(MOD/i)*inv[MOD%i])%MOD;
        finv[i]=(finv[i-1]*inv[i])%MOD;
    }
} 

inline LL quick_pow(LL x,LL y)
{
    x%=MOD;LL res=1;
    while (y)
    {
        if (y&1) res=(res*x)%MOD,y--;
        x=(x*x)%MOD;y>>=1;
    }
    return res;
}

int len;
LL wn_pos[100048],wn_neg[100048];
inline void init_wn()
{
    for (register int clen=2;clen<=len;clen<<=1)
    {
        wn_pos[clen]=quick_pow(G,(MOD-1)/clen);
        wn_neg[clen]=quick_pow(G,(MOD-1)-(MOD-1)/clen);
    }
}

LL a[100048],b[100048];

inline void NTT(LL c[],int fl)
{
    int i,j,k,clen;
    for (i=(len>>1),j=1;j<len;j++)
    {
        if (i<j) swap(c[i],c[j]);
        for (k=(len>>1);i&k;k>>=1) i^=k;
        i^=k;
    }
    for (clen=2;clen<=len;clen<<=1)
    {
        LL wn=(fl==1?wn_pos[clen]:wn_neg[clen]);
        for (j=0;j<len;j+=clen)
        {
            LL w=1;
            for (k=j;k<j+(clen>>1);k++)
            {
                LL tmp1=c[k],tmp2=(c[k+(clen>>1)]*w)%MOD;
                c[k]=(tmp1+tmp2)%MOD;c[k+(clen>>1)]=((tmp1-tmp2)%MOD+MOD)%MOD;
                w=(w*wn)%MOD;
            }
        }
    }
    if (fl==-1)
        for (i=0;i<len;i++) c[i]=(c[i]*inv[len])%MOD;
}

inline void calc_NTT()
{
    NTT(a,1);NTT(b,1);
    for (register int i=0;i<len;i++) a[i]=(a[i]*b[i])%MOD;
    NTT(a,-1);
}

struct poly
{
    LL A[100048];
    inline poly operator * (const poly B) const
    {
        int i;poly res;
        memset(a,0,sizeof(a));memset(b,0,sizeof(b));
        for (i=0;i<=m;i++) a[i]=A[i],b[i]=B.A[i];
        calc_NTT();
        for (i=0;i<=m;i++) res.A[i]=a[i];
        return res;
    }
};

inline poly Quick_pow(poly x,LL y)
{
    int i;poly res;
    for (i=0;i<=m;i++) x.A[i]%=MOD;
    res.A[0]=1;
    while (y)
    {
        if (y&1) res=res*x,y--;
        x=x*x;y>>=1;
    }
    return res;
}

int main ()
{
    int i,j,k;
    scanf("%s%s",s1+1,s2+1);n=strlen(s1+1);
    init_inv();
    e=m=0;
    for (i=1;i<=n;i++)
    {
        if (s1[i]=='1' && s2[i]=='0') e++;
        if (s1[i]=='1' && s2[i]=='1') m++;
    }
    len=1;while (len<=m*2) len<<=1;
    init_wn();
    poly ans;for (i=0;i<=m;i++) ans.A[i]=finv[i+1];
    ans=Quick_pow(ans,e);
    LL fans=0;
    for (i=0;i<=m;i++) fans=(fans+ans.A[i])%MOD;
    fans=fans*fac[e]%MOD*fac[m]%MOD*fac[e+m]%MOD;
    printf("%lld\n",fans);
    return 0;
}
C# 实现 Modbus 通信全教程(支持 TCP 和 RTU,含完整错误处理) 环境准备:安装 NModbus4 库,明确设备参数(IP/串口、地址、数据类型);连接设备:TCP 用 TcpClient,RTU 用 SerialPort,注意超时和参数匹配;读写数据:根据数据类型调用对应方法(读保持寄存器用 ReadHoldingRegisters);错误处理:捕获连接、超时、协议等异常,针对性排查问题。掌握这些后,即可轻松实现与工业设备的 Modbus 通信,为上位机开发提供稳定的数据交互能力。 阅读详情

相关推荐

SystemVue 链路预算、仿真分析步骤

使用SystemVue进行链路预算、频谱分析等,相对ADS更全面。

BeCourageable的博客 3836

【DP】AGC019E Shuffle and Swap

分析: 可以尝试构造每一个合法数列。 显然,如果某个位置,Ai=1A_i=1Ai​=1且Bi=1B_i=1Bi​=1,那么这个A中的1被拿走后,必须有一个1填回来。此类点定义为公共点。 如果某个位置,Ai=1且Bi=0A_i=1且B_i=0Ai​=1且Bi​=0,那么这个A中的1被拿走后,不能有其他1填进来。此类点定义为非公共点。对应的,称Ai=0且Bi=1A_i=0且B_i=1Ai​=0且Bi​...

氧化钠的博客 479

Windows 10 下 DockerToolbox 安装全攻略:从下载到配置阿里云镜像加速

本文详细介绍了在Windows 10系统上安装和配置DockerToolbox的完整流程。从下载安装包、执行初步安装,到关键步骤——修改虚拟机存储路径以及配置阿里云镜像加速器,旨在帮助开发者,尤其是初次接触Docker的新手,快速搭建高效的本地容器开发环境,并解决国内镜像下载缓慢的痛点。

moon9的博客 476

[agc019e]Shuffle and Swap

前言计数水平不行了。 居然不会n^2去dp这个模型。题意太麻烦了看网站。DP假设有x个公用1和y个非公用1。 用图论来理解。 最后一定形成y条链,若干个环。 其中链中的边在序列中要按顺序,环则随意。 环可以先不管。 考虑dp[i,j]表示目前做出来两个i+j的序列,有i个公用1和j个非公用1,区分编号,有顺序,形成j条链的方案数。 有dp[i,j]=dp[i-1,j]*i*j+dp[i

不来也不去的一只失忆蝴蝶 779

LT码与Raptor码的性能仿真

从数据分析看来,在数据块大小较小时(100 - 200 左右 ),LT 码和 Raptor 码的平均冗余符号数量差距相对较小,但 LT 码的冗余符号数量始终高于 Raptor 码。现在采用MATLAB进行仿真,直观展示不同数据块大小下,两种解码方式的解码时间差异.如图4.1所示,LT解码(绿色圆点折线)LT 解码方式的解码时间随数据块大小的变化情况。从实际应用的角度来看,LT码由于其简单的编码机制,适用于资源受限或对编码效率要求较高的场景,但其较高的解码复杂度限制了其在一些实时性要求较高的应用中的使用。

道亦无名 1137

OData V2 消息在 SAP UI5 中的生成、传播与治理全解

SAP UI5 的 OData V2 消息机制通过自动解析服务端响应头(sap-message)或错误体,将消息推送到全局 MessageModel,实现数据质量保障。关键点包括:1)消息通过目标路径与控件绑定联动,触发高亮等反馈;2)生命周期管理需注意避免自动刷新导致消息丢失;3)常见陷阱如批处理错误重复、内外层消息冲突等可通过精准目标路径或自定义处理器解决。代码示例展示了如何配置模型、消息模型及 MessagePopover 实现端到端消息展示,同时支持控件通过 refreshDataState 自定义

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 232

AtCoder Grand Contest 019

费劲千辛万苦,终于自己独立做出了一场AGCAGCAGC,尽管蒟蒻总共花费了近5h5h5h,不过依旧很开心,今天晚上可以奖励自己吃点宵夜。 A - Ice Tea Store 按照2L2L2L的容量排个序,如果最小的是2L2L2L装的,那么就先拿2L2L2L装,再拿第二小的装剩下的,否则直接拿最小的装。 #include<bits/stdc++.h> using namespace std; pair<int,int> e[4]; int a,b,c,d,n; int main()

Deep_Kevin的娱乐空间 414

Python 爬虫实战:抓取新闻网站上的新闻标题和内容

随着信息化的进展,新闻网站已经成为人们获取新闻和时事资讯的主要途径。许多新闻网站提供了丰富的内容,涵盖了社会、政治、科技、娱乐等多个领域。通过抓取新闻网站的内容,我们可以分析新闻的趋势,获取某一领域的最新动态,甚至为数据分析和机器学习提供数据支持。本文将详细介绍如何使用 Python 编写爬虫,抓取新闻网站上的新闻标题和内容。requests:发送 HTTP 请求,获取页面内容。:解析 HTML 页面并提取数据。Selenium:抓取动态加载的网页内容。新闻API。

2201_76125261的博客 3408

【AtCoder】AGC019

A - Ice Tea Store 算一下每种零售最少的钱就行,然后优先买2,零头买1 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define spa...

weixin_30419799的博客 178

R语言广义加型模型(GAM)的运用例子及实现教程

一旦拟合了广义加型模型,我们可以查看模型摘要和诊断,以评估模型的质量和拟合情况。# 查看模型摘要响应变量:mpg(汽车的燃油效率)拟合函数:mpg ~ s(hp) + s(wt)

Mrrunsen的博客 3446

60、磁悬浮主动隔振系统的LQR控制研究

本研究针对磁悬浮主动隔振系统,提出了一种结合ANN建模、LQR控制与MPGA优化的综合控制方案。通过建立系统的动力学与状态空间模型,利用混合训练算法的ANN精确描述MSVI的非线性和滞后特性,并设计基于最小力传递率的LQR控制器。为优化LQR的Q和R矩阵,引入多群体遗传算法(MPGA),有效克服传统GA的早熟收敛问题,提升搜索效率与控制性能。仿真结果表明,在单频、扫频、随机及冲击激励下,该方法显著降低传递力幅值,隔振效果远优于被动系统。研究验证了所提方法的有效性,为磁悬浮隔振技术的实际应用奠定了基础,并展望

linux6sysadmin的博客 127

AGC019-E Shuffle and Swap

给定两个长度为\(n\le 10^5\)的\(01\)串 \(A, B\), 满足 \(1\) 的数量相等 求通过下列方式将\(A\)变成\(B\)的概率 (mod意义下) 构造序列\(a,b\). 使得 \(a_i = A中第i个1的位置\), b同理 对\(a,b\)进行shuffle 然后for i from 1 to n: swap(A[a[i]], A[b[i]]) Analysis 瞎...

weixin_30699741的博客 177

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1760

AtCoder Grand Contest 019 E - Shuffle and Swap

链接:link题意:给两个01串AA,BB,它们11的个数相同,记aia_i表示AA中11的出现位置,bib_i表示BB中11的出现位置,将aa和bb打乱后依次交换AaiA_{a_i}和AbiA_{b_i},求有多少种方式使得A=BA=B。题解:我们先考虑aa和bb的匹配,再考虑顺序。 对于一个给定的匹配,我们从aia_i到bib_i连一条有向边,注意到每个点入度和出度不超过11,所以这个图一定由

wxh010910 1587

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

(NTT)AtCoder Grand Contest 019 E - Shuffle and Swap

E - Shuffle and Swap Time limit時間制限 : 2sec / Memory limitメモリ制限 : 512MB 配点 : 1700 点 問題文 0 と 1 からなる同じ長さの二つの文字列 A=A1A2…An と B=B1B2…Bn があります。 A,B に含まれる 1 の個数は等しいです。 あなたは次のアルゴリズムによって A を変化させることに...

weixin_30357231的博客 229

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Atcoder Grand Contest 019 总结

这把AGC打的还不错233..这次的C题,我在两个小时里面WA了10次,在最后40秒的时候绝望交了一发C竟然过了..运气真好233 最终rank:223 rating+=197 目前rating:1591(Fighting!!!) A - Ice Tea Store 题意:给你一共44种杯子,他们的容量分别是0.25,0.5,1,2,他们的单价分别是a,

Ephemeral 223

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[AGC019E]Shuffle and Swap

[AGC019E]Shuffle and Swap 题目大意: 给出两个长度为\(n(n\le10000)\)的\(01\)串\(A_{1\sim n}\)和\(B_{1\sim n}\)。两个串均有\(k\)个'1'。令\(a_{1\sim k}\)和\(b_{1\sim k}\)分别表示\(A\)和\(B\)中所有'1'出现的位置。将\(a\)和\(b\)等概率随机排列,按\(1\sim k\...

weixin_33790053的博客 249

AGC019 E.Shuffle and Swap-DP+NTT

传送门 题意: 给出两个01串A,b,记aiaia_i表示A中1的出现位置,bibib_i表示B中1的出现位置,将a数组和b数组打乱后依次次交换AaiAaiA_{a_i}和AbiAbiA_{b_i},求有几种方式使得A=B 字符串长度&lt;=10000 Solution: 我们可以把答案拆分成两步: 1.枚举a和b的匹配 2.打乱匹配顺序 假设我们已经完成了操作1,我们来...

Fizzmy的博客 606

AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)

题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来……这题我好像想歪了啊= =…… 首先我们可以考虑,什么样的操作序列才是合法的? 有用的位置只有两种,一种是两个序列在这个位置上都是1, 称作11型,另一种是一个0一个1, 称作01型。设两种位置分别有\(A\)个和\(2B\)个。 考...

suncongbo's blog 423

[AtCoder Grand Contest 019] F: Yes or No (agc019F)

原题链接 https://agc019.contest.atcoder.jp/tasks/agc019_f Description 有N+M个问题,N个问题的答案是Yes,M个问题的答案是No 现在将这N+M个问题随机排列 你需要按顺序回答,每回答一个问题就会告诉你这道题的正确答案 求最优策略下答对问题的期望数量 答案对998244353取模 n,m&amp;lt;=5e5 So...

Never give in. 544

Atcoder Grand Contest 019

蒟蒻只改了前4题。 tourist 果然强……Orz A 贪心 B 比赛时打了一下表,发现就是相当于令每个字母个数XiX_i,把C(XiX_i)加起来为S,答案即C(N)-S。简单伪证一下,两个相同字母中间的区间会多算一次,减掉即可。 另:C(N)=N∗(N−1)2\frac{N*(N-1)}{2} C 对于喷泉求一个LIS即可,比赛时想到过,然而忘了每条街道只有一个喷泉的条件,

Moon1125666900的博客 511

Atcoder AGC019简要题解

传送门 Reverse and Compare 发现两个串如果翻转后一样且中心不一样,则必定有一个是回文串。然后就只用统计两端字母不同的串的个数了。 #include &lt;bits/stdc++.h&gt; using namespace std; typedef long long LL; const int N=2e5+50; char ch[N]; int n,cnt[26],s; ...

DZYO的博客 506

AtCoder Grand Contest 019F Yes or No 组合数学

Description 有n+m道题目,n道题目的答案为Y,m道为N 现在你要回答这n+m道题目,每次会从没答过的题目中抽一道回答,若回答正确就加一分。问最优策略下得分的期望 Solution tourist的题目真是劲啊 我们可以用一对整数对(x,y)表示一个剩余x个1问题,剩余y个2问题的局面。显然每一步的最优策略就是猜剩得多的那个,这样等价于我们在每个点有概率往两个方向走一步,且只有一种...

olahiuj的博客 352

AtCoder Grand Contest 019 F - Yes or No

链接:link题意:有n+mn+m个询问,其中nn个是YES,mm个是NO,你回答一个问题之后会知道这个问题的答案,求最优策略下你期望对多少个。题解:显然最优策略是回答多的那个。 不妨设n≥mn\ge m,将正确答案画在二维平面上,发现是(n,m)(n, m)到(0,0)(0, 0)的一条路径。 画一条对角线y=xy=x,我们发现如果路径不经过对角线那么答案就是nn。 我们考虑计算答案的增量,

wxh010910 1881

AtCoder Grand Contest 019 C - Fountain Walk (LIS)

题目:传送门思路:想要走最短距离,肯定是两点之间的曼哈顿距离最短,并且走过最多的喷泉。因为是最短,所以只能往终点方向移动,求一下起点到终点之间喷泉y坐标的最大单调序列,就能知道最多经过多少喷泉。有一种特殊情况,就是起点到终点的每一行或者每一列都有可走的喷泉(如下图),这样就要多算1/4个圆周。 代码如下:#include<iostream> #include<cstdio> #include<cs

GOTOTHEBAD 2492

AtCoder Grand Contest 019 C - Fountain Walk 贪心+dp

题意 有一个无限大的网格图,要求从(x1,y1)走到(x2,y2)。有n个格点上有半径为0.1个单位长度的喷泉,经过喷泉时必须沿着圆周走。问最短路。 n 分析 不难发现走喷泉的话,拐弯会使得路径缩短,直走会使得路径增长。 贪心地想,肯定是要尽量拐弯且走的喷泉越多越好。 因为喷泉半径实在太小,所以不能绕弯。 不难发现这就是一个最长上升子序列问题。 还有一个情况就是若每行或每列都要走喷

beginend 328
上一篇: TopCoder SRM469C: TheMoviesLevelThreeDivOne 题解
下一篇: Codeforces #251D: Two Sets 题解
IcePrincess_1968
博客等级 码龄9年 13粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值