模拟+算贡献——cf1195D
2024-08-30 09:18:48
比赛的时候没看到模数,用java大数在写,最后看到的时候已经慌了。。
把贡献算清楚就可以
下面是贡献的推导
有五位数 abcde * 10个
有两位数 fg * 3 个
那么这两种数组成的情况就是 abcdfeg 或 abcfdge,现在只考虑五位数在前,两位数在后的情况,
五位数的情况是abcd_e_,每个五位数出现了3次,那直接把10个五位数在每位上求和,然后这个五位数的贡献*3,
两位数的情况是____f_g,每个两位数出现了10次,那么也直接把3个两位数在每位上求和,然后这个两位数的贡献*10
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long
#define mod 998244353
ll n,a[maxn],A[];
ll cnt[],x[][];
void calc(ll a){
ll len=,tmp=a,pos=;
while(tmp){
tmp/=;len++;
}
cnt[len]++; tmp=a;
while(tmp){
pos++;
x[len][pos]+=tmp%;
tmp/=;
}
} ll f(int i,int j){
ll res1=,res2=;
if(i>j){
for(int k=;k<=j;k++){
res2=(res2+x[j][k]*A[k*-]%mod)%mod;
res1=(res1+x[i][k]*A[k*]%mod)%mod;
}
for(int k=j+;k<=i;k++)
res1=(res1+x[i][k]*A[j+k]%mod)%mod;
}
else if(i==j){
for(int k=;k<=i;k++){
res2=(res2+x[j][k]*A[k*-]%mod)%mod;
res1=(res1+x[i][k]*A[k*]%mod)%mod;
}
}
else if(i<j){
for(int k=;k<=i;k++){
res2=(res2+x[j][k]*A[k*-]%mod)%mod;
res1=(res1+x[i][k]*A[k*]%mod)%mod;
}
for(int k=i+;k<=j;k++)
res2=(res2+x[j][k]*A[k+i]%mod)%mod;
}
return (res1*cnt[j]+res2*cnt[i]%mod)%mod;
} int main(){
cin>>n;
A[]=;
for(int i=;i<=;i++)A[i]=A[i-]*%mod;
for(int i=;i<=n;i++){
cin>>a[i];
calc(a[i]);
}
ll ans=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(cnt[i] && cnt[j])
ans=(ans+f(i,j))%mod;
cout<<ans<<endl;
}
最新文章
- PHP 缩放图片
- LeetCode#227.Basic Calculator II
- BZOJ3813: 奇数国
- 理解javascript中的原型模式
- CentOS安装XRDP实现远程桌面访问
- but has failed to stop it. This is very likely to create a memory leak(c3p0在Spring管理中,连接未关闭导致的内存溢出)
- 如何将硬盘GPT分区转换为MBR分区模式
- 自然语言处理中的自注意力机制(Self-attention Mechanism)
- JavaEE EL &; JSTL 学习笔记
- Redis主从同步要深入理解?一篇文章足矣!
- locate命令
- vue三级联动
- [Oracle运维工程师手记] 如何从trace 文件,判断是否执行了并行
- mongodb使用问题记录
- CSS选择器:子选择符号
- JQuery遍历,find()和each()方法
- win10 Xshell5连ubuntu服务器
- Python基础学习Day4 列表的使用方法、range 用法、in用法
- JAVA面对对象(二)——继承、方法的覆写
- docker报错“net/http: TLS handshake timeout”的解决方法