2021.05.03 T3 数字

问题描述

一个数字被称为好数字当他满足下列条件:
1. 它有**2*n**个数位,n是正整数(允许有前导0)
2. 构成它的每个数字都在给定的数字集合S中。
3. 它**前n位之和与后n位之和相等**或者它**奇数位之和与偶数位之和相等**
例如对于n=2,S={1,2},合法的好数字有1111,1122,1212,1221,2112,2121,2211,2222这样8种。

已知n,求合法的好数字的个数mod 999983。

输入

第一行一个数n。
接下来一个长度不超过10的字符串,表示给定的数字集合。

输出

一行一个数字表示合法的好数字的个数mod 999983。

样例输入

2

0987654321

样例输出

1240

数据范围

对于20%的数据,n≤7。
对于100%的.据,n≤1000,|S|≤10。

分析:

设f[i][j]为当数字规模为i且各数为位数字之和为j时的好数字个数,f[i+1][j+s[k]]的方案数中一定有f[i][j]的方案数,所以f[i+1][j+s[k]]=f[i][j]+f[i+1][j+s[k]]。把左半部分看成一个名为A的位置,把右半部分看成一个名为B的位置,A和B上都有f[i][j]中方案数,则在i与j一定时,一共有A*B种方案数。

把n个数划分为i部分,则i的取值范围是1n,当i=0是,A(或B)这一位置上只有一种放法——什么都不放,在这一题就是没有任何方案.当i个位置上所有数字全是9时,j最大,j的取值范围是sminismaxi,但集合s中不一定有9,所以需要判断一下smax与smin,实际上不用单独找,sort排序一下或直接判断有没有f[i][j]。

前后和相等和奇偶位和相等与每个小位置上具体是哪个数字以及到底有那些数字无关,只与和有关,所以前后和相等的方案数与奇偶位和相等的方案数相等。设总方案数为ans,ans=奇偶位和相等的方案数+前后位和相等的方案数-前后位相等的方案数与奇偶位和相等的方案数的交集。

当前后位和相等的方案数=奇偶位和相等的方案数时,前位奇数位和=后位偶数位和,前位偶数位和=后位奇数位和,当从集合s中选取的数字不变时,前位奇数位和可以做后位奇数位和。设前位奇数位和为C,则与之相对的后位奇数为和为D,则交集方案数为C*D。

PS:

if(f[x][i])fin=(fin+(ll)f[x][i]*f[x][i])%mod;

此处如果先乘后转为long long会爆int,所以不能把ll后面的乘法用括号括住

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define mod 999983
typedef long long ll;
int n,s[12],f[1005][9005];
ll ans=0;
string si;
ll add(int x){
ll fin=0;
for(int i=0;i<=x*9;i++)
if(f[x][i])fin=(fin+(ll)f[x][i]*f[x][i])%mod;
return fin;
}
int main(){
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
cin>>n>>si;
for(int i=0;i<si.size();i++)s[i+1]=si[i]-'0';
sort(s+1,s+si.size()+1);
f[0][0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<=n*9;j++){
if(f[i][j]){
for(int k=1;k<=si.size();k++){
f[i+1][j+s[k]]=(f[i+1][j+s[k]]+f[i][j])%mod;
}
}
}
}
ans=(2*add(n)-add(n/2)*add(n-n/2))%mod;
cout<<(ans+mod)%mod;
return 0;
}

2021.05.03 T3 数字的更多相关文章

  1. 2021.05.03【NOIP提高B组】模拟 总结

    比较水的一场比赛,却不能 AK T1 有 \(n\) 次,每次给 \(A_i,B_i\) 问以 \(i\) 结尾的 \(A,B\) 的匹配中最大和的最小值 问最大和的最小值,却不用二分. 如果暴力排序 ...

  2. http://www.cnblogs.com/Matrix54/archive/2012/05/03/2481260.html

    http://www.cnblogs.com/Matrix54/archive/2012/05/03/2481260.html

  3. 2021.11.03 P6175 无向图的最小环问题

    2021.11.03 P6175 无向图的最小环问题 P6175 无向图的最小环问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 给定一张无向图,求图中一个至少包含 33 ...

  4. 2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)

    2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed) [P2886 USACO07NOV]Cow Relays G - 洛谷 | 计算机科学教育新生 ...

  5. 2021.05.14 tarjan

    2021.05.14 tarjan 标准版tarjan 这里使用数组来模拟栈 void tarjan(int x){ ++ind; dfn[x]=low[x]=ind; stacki[++top]=x ...

  6. 2021.08.03 BZOJ 疯狂的馒头(并查集)

    2021.08.03 BZOJ 疯狂的馒头(并查集) 疯狂的馒头 - 题目 - 黑暗爆炸OJ (darkbzoj.tk) 重点: 1.并查集的神奇运用 2.离线化 题意: 给一个长为n的序列,进行m次 ...

  7. 2021.08.03 P1197 星球大战(并查集)

    2021.08.03 P1197 星球大战(并查集) [P1197 JSOI2008]星球大战 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.可以离线处理.把在线变为离 ...

  8. 2021.08.01 P4311 数字序列(左偏树)

    2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...

  9. 【2021新】C#数字格式化字符串

    引用来源: https://www.cnblogs.com/flyingbread/archive/2007/01/18/620287.html https://www.cnblogs.com/117 ...

随机推荐

  1. 和风天气WebApi使用教程

    1.首先进入和风天气开发平台,点击右上角的注册进行注册 和风天气开发平台 2.填写注册用的邮箱和密码完成注册,可能还需要手机号,按提示注册完成即可. 3.从和风天气开发平台右上角进入控制台,输入你刚刚 ...

  2. Docker安装与基本命令

    docker安装 Ubuntu 更新apt包索引 sudo apt-get update 更新apt包索引 sudo apt-get upgrade 安装docker sudo apt-get ins ...

  3. sqlmap的常用tamper脚本

    sqlmap下的tamper目录存放绕过WAF脚本 使用方法 --tamper 脚本名称,脚本名称 多个tamper脚本之间用空格隔开 apostrophemask.py 用utf8代替引号 equa ...

  4. 【Vulnhub练习】Acid

    靶机信息 下载链接 https://download.vulnhub.com/acid/Acid.rar 靶机说明 Welcome to the world of Acid. Fairy tails ...

  5. Docker容器入门介绍

    1.前言 Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机.不过,Docker 跟传统的虚拟化方式相比具有众多的优势.Docker: 本意是码头工人,言外之意是集装箱: Java号称 ...

  6. VMware Workstation网络修改vlan id值

    我们捣鼓虚拟机时,有时候网卡是需要承载多个vlan的,比如说部署fuel时网卡3需要承载私有,管理,存储网络的流量. 在virtualbox中我们可以直接在混杂模式项选择全部允许,但是在VMware ...

  7. CF1479X Codeforces Round #700

    C Continuous City(图的构造) 题目大意:让你构造一个n\le 32的有向无环无重边图,使得从1走到n的所有路径长度在L,R之间,且每种长度的路径只有唯一一条,$L,R\le 1e6$ ...

  8. Pytorch自动混合精度(AMP)介绍与使用

    背景: pytorch从1.6版本开始,已经内置了torch.cuda.amp,采用自动混合精度训练就不需要加载第三方NVIDIA的apex库了.本文主要从三个方面来介绍AMP: 一.什么是AMP? ...

  9. Java 死锁以及如何避免?

    Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java 死锁情况 出现至少两个线程和两个或更多资源. Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.

  10. Mybatis 开发 dao 的方法

    1.分析SqlSession使用范围 1.1.SqlSessionFactoryBuilder 通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory ...