CF856C 题解

news/2025/2/1 22:05:52/文章来源:https://www.cnblogs.com/Jordan-Pan/p/18696497

0

原题链接:luogu & CF

在任务清单里放了半年,今天终于做出来了 qwq,不得不写题解了。

1

能被 \(11\) 整除的数长什么样子?它的奇数位之和与偶数位之和应当模 \(11\) 同余。

我们不妨把一个数的价值定为从前往后奇数位之和减去偶数位之和模 \(11\) 的值。例如,我们把 114514 的值赋为 \((1+4+1)-(1+5+4)=7\)

整个序列大概是这样的(画的好丑啊,不想改了):

一个数的价值对于整个序列拼成的数的价值会有什么贡献呢?可能为 \(+x\),也可能为 \(-x\),这取决于这个数在序列中的起始位置的奇偶性。比如图中起始下标为 \(1,3,9\) 的数 \(76,5,9\) 产生了正贡献。

为了方便,我们称奇位的数为“奇数”(如 \(5,233,1234567\) 等,图中标蓝),偶位的数为“偶数”。容易发现,如果这个数是“奇数”,排在他之后的元素正负性要反转一下,如果是“偶数”则不变。于是我们先填“奇数”,把“偶数”填在空位里就好。

后面就是计算了。产生正贡献的“奇数”数量是一定的(这应该挺显然的,等于“奇数”数量除以二向上取整),“偶数”则不一定。为了让价值加起来的结果为 \(0\)(这样才能被 \(11\) 整除),我们考虑对两者分别 dp。

\(f_{i,j,k}\) 表示前 \(i\) 个“奇数”,其中选了 \(j\) 个产生正贡献(相应地有 \(i-j\) 个产生负贡献),目前的总价值 \(\bmod 11 =k\),这样的排列数有多少个。分这个数选正还是选负转移即可,从 \(i-1\) 转移到 \(i\) 时,空位数就是填正空位的 \(j\) 或者填负空位的 \(i-j\)

接下来是对“偶数”的 dp,记 \(g_{i,j,k}\) 意义同上。这里需要提前计算空位数量,填完“奇数”后排列就形成了一个“框架”,其中空位数为“奇数”数量加一,产生正贡献的空位和负贡献的空位交错排列。之后每在正空位填一个“偶数”,正空位数就会多一个(可以填在这个“偶数”的左边和右边)。同样的,填入“偶数”的数量我们已经记在状态里了,就是 \(j\)。负空位反之。

最后我们统计答案,如果有 \(x\) 个奇数,\(y\) 个偶数,枚举 \(f_{x,\lceil \frac{x}{2} \rceil,k1}\) 中的 \(k1\)\(g_{y,j,k2}\) 中的 \(j\)\(k2\),如果 \(k_1+k+2 \bmod 11 =0\),就能对答案产生二者相乘的贡献。

然后我们就做完了。

2

代码感觉完全看不了啊。dp 数组大小有点危险,滚了一下。

constexpr int _=2005,B=10,M=11,mod=998244353;
void P(int&x,int y){if((x+=y)>=mod)x-=mod;}
int n;
std::vector<int>a,b;
int jishugeshu,oushugeshu,zhengshuliang,fushuliang,zhengkongwei,fukongwei;
int f[2][_][11],cf,g[2][_][11],cg,ans;
void solve(){rd(n);a.clear();b.clear();for(int i=1,x;i<=n;i++){rd(x);int val=0,j;for(j=1;x;j++,x/=B){if(j&1)val+=x%B;else val-=x%B;}val%=M;if(val<0)val+=M;if(j&1)b.push_back(M-val);else a.push_back(val);}jishugeshu=a.size();oushugeshu=b.size();cf=0;memset(f[cf],0,sizeof f[cf]);f[cf][0][0]=1;for(int i=1,v;i<=jishugeshu;i++){cf^=1;v=a[i-1];memset(f[cf],0,sizeof f[cf]);for(int j=1;j<=i;j++)for(int k=0;k<M;k++)P(f[cf][j][(k+v)%M],f[cf^1][j-1][k]);for(int j=0;j<i;j++)for(int k=0;k<M;k++)P(f[cf][j][k],f[cf^1][j][(k+v)%M]);}//这里的转移没有计算填了哪一个位置,提到外面去了 zhengkongwei=jishugeshu/2+1;fukongwei=jishugeshu+1-zhengkongwei;cg=0;memset(g[cg],0,sizeof g[cg]);g[cg][0][0]=1;for(int i=1,v;i<=oushugeshu;i++){cg^=1;v=b[i-1];memset(g[cg],0,sizeof g[cg]);for(int j=1;j<=i;j++)for(int k=0;k<M;k++)P(g[cg][j][(k+v)%M],1ll*g[cg^1][j-1][k]*(zhengkongwei+j-1)%mod);for(int j=0;j<i;j++)for(int k=0;k<M;k++)P(g[cg][j][k],1ll*g[cg^1][j][(k+v)%M]*(fukongwei+i-1-j)%mod);}fushuliang=jishugeshu/2;zhengshuliang=jishugeshu-fushuliang;ans=0;for(int i=0;i<=oushugeshu;i++){P(ans,1ll*f[cf][zhengshuliang][0]*g[cg][i][0]%mod);for(int j=1;j<M;j++)P(ans,1ll*f[cf][zhengshuliang][j]*g[cg][i][M-j]%mod);}for(int i=1;i<=zhengshuliang;i++)ans=1ll*ans*i%mod;for(int i=1;i<=fushuliang;i++)ans=1ll*ans*i%mod;//这里因为奇数的正负数量已经确定了,枚举排列就放到这里了 printf("%d\n",ans);
}
int main(){int T;rd(T);for(;T;T--)solve();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877693.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人生不止于职业发展

0 你的问题,我知道! 工作意义是啥?职业发展在人生啥角色? 1 工作意义 农村人努力学习考上大学,得好工作,为逃离同村同龄人十几岁就工厂打工命运,过不凡人生,实现改命的唯一途径。毕业就进入自带光环的大厂,有份让所有亲戚羡慕的公司和薪水。我认为工作价值是让自己自立…

『Python底层原理』--CPython如何编译代码

前一篇我们介绍了CPython VM的运行机制,它基于一系列字节码指令来实现程序逻辑。 不过,Python字节码在完整描述代码功能上存在局限性,于是代码对象应运而生。像模块、函数这类代码块的执行,本质上就是对应代码对象的运行,代码对象涵盖了字节码、常量、变量名以及各类属性信…

MyBatis之jdbc属性外部配置

将jdbc数据库连接属性写在db.properties中,如图 然然后在配置文件中引入

25.2.1小记

Object类Object类中自带的toString和equals函数(默认比较管理者是否管理相同的对象,可以通过对子类函数的重构实现正常比较) // @Override//重写,编译器会默认构造类型检查public boolean equals(Object obj) {//向下造型CD cc = (CD)obj;return artist.equals(cc.artist…

“尝试一下挣钱的辛苦”之装师

我尝试了把我做的兽头卖出去,记录一下从孩子出生到找到妈咪领养的过程 因为没有太多预算,所以兽设没有找画师,我自己构思的;整个制作过程都要用到热熔胶,很容易烫到>_<(热熔胶——手作娘离不开的东西),梳理毛布也很让人头疼,弄得房间里都是毛毛,虽然但是,孩子…

“尝试一下挣钱的辛苦”

我尝试了把我做的兽头卖出去,记录一下从孩子出生到找到妈咪领养的过程 因为没有太多预算,所以兽设没有找画师,我自己构思的;整个制作过程都要用到热熔胶,很容易烫到>_<(热熔胶——手作娘离不开的东西),梳理毛布也很让人头疼,弄得房间里都是毛毛,虽然但是,孩子…

VScode使用插件open-in-browser在默认浏览器中打开html文件

1. vscode extension中搜索open in browser,并下载。 我下载的第一个2. 打开.html文件 alt+shift+b手动选择特定浏览器打开 alt+b用默认浏览器打开,如果没有设置默认浏览器,可能出现以下问题3. 配置默认浏览器 ctrl+shift+p打开command palette 输入settings.json,打开Open…

在MacOS上安装sqllite

参考教程 https://www.runoob.com/sqlite/sqlite-installation.html 1.下载sqllite安装包 https://www.sqlite.org/2025/sqlite-autoconf-3480000.tar.gz wget https://www.sqlite.org/2025/sqlite-autoconf-3480000.tar.gz tar -xvzf sqlite-autoconf-3480000.tar.gz cd sqlit…

【译】MongoDB EF Core 提供程序:有什么新功能?

原文 | Rishit, Luce 翻译 | 郑子铭 这是 Rishit Bhatia 和 Luce Carter 的客座文章。Rishit 是 MongoDB 的高级产品经理,专注于 .NET 开发人员体验,在进入产品管理部门之前,他已经使用 C# 工作多年。Luce 是 MongoDB 的开发倡导者、Microsoft MVP,热爱代码、阳光和学习。本…

06. 文件权限

一、文件属性Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保证系统的安全性,Linux 系统对不同的访问用户访问同一个文件(包括目录文件)的权限做了不同的规定。在 Linux 中,我们可以使用 ll 或者 ls -l 命令来显示一个文件的属性以及…

java中的Hashtable

Hashtable Hashtable 是 Java 中的一个古老的集合类,它实现了 Map 接口,基于哈希表存储键值对。 Hashtable 是线程安全的,所有方法都用 synchronized 修饰,因此在多线程环境下可以安全使用。 不过,由于它的性能较差,现代开发中更推荐使用 HashMap Hashtable中的t是小写,…