当前位置:网站首页>AtCoder Beginner Contest 262 D - I Hate Non-integer Number
AtCoder Beginner Contest 262 D - I Hate Non-integer Number
2022-08-04 21:08:00 【Vegetable newbie】
AtCoder Beginner Contest 262
D - I Hate Non-integer Number
题意
给你一个长度为 n n n的数组,问:从数组中选择任意个 元素,这些元素的平均数为整数的方案数为多少。
数据范围
1 ⩽ n ⩽ 100 1 \leqslant n \leqslant 100 1⩽n⩽100
思路
本题考察 动态规划
我们令 d p [ j ] [ k ] [ l ] dp[j][k][l] dp[j][k][l]为在长度为 i i i的情况下,数组中前 j j j个元素中选择 k k k个元素 m o d mod mod % i \%i %i 为 l l l的方案数。
那么答案就是
∑ i = 1 n d p [ n ] [ i ] [ 0 ] \sum_{i = 1}^{n} dp[n][i][0] i=1∑ndp[n][i][0]
转移:我们可以考虑第 j j j个数是否选择来进行转移
d p [ j ] [ k ] [ l ] = { d p [ j − 1 ] [ k ] [ l ] ( 不选 ) d p [ j − 1 ] [ k − 1 ] [ l − ( a [ j ] % i ) ] ( a [ j ] % i ⩾ 0 ) d p [ j − 1 ] [ k − 1 ] [ i + l − ( a [ j ] % i ) ] ( a [ j ] % i < 0 ) dp[j][k][l] = \begin{cases}dp[j - 1][k][l]\quad(不选)\\ dp[j - 1][k - 1][l - (a[j]\ \% \ i)] \quad(a[j] \ \%\ i\ \geqslant\ 0)\\ dp[j - 1][k - 1][i + l - (a[j] \ \% \ i)]\quad (a[j]\ \% \ i< 0)\end{cases} dp[j][k][l]=⎩⎨⎧dp[j−1][k][l](不选)dp[j−1][k−1][l−(a[j] % i)](a[j] % i ⩾ 0)dp[j−1][k−1][i+l−(a[j] % i)](a[j] % i<0)
初始化:
d p [ 0 ] [ 0 ] [ 0 ] = 1 dp[0][0][0] = 1 dp[0][0][0]=1
时间复杂度
O ( N 4 ) O(N^4) O(N4)
代码
#include <bits/stdc++.h>
#define PII pair<int,int>
#define LL long long
#define fi first
#define se second
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define Yes puts("Yes");
#define No puts("No");
#define sz(x) (int)x.size()
using namespace std;
inline string rd()
{
string str="";
char ch=getchar();
while(ch==' ' || ch=='\n' || ch=='\r')
{
ch=getchar();
}
while(ch!=' ' && ch!='\n' && ch!='\r')
{
str+=ch;
ch=getchar();
}
return str;
}
inline void print(string s)
{
for(int i=0; s[i]!='\0'; i++) putchar(s[i]);
}
template <typename T> void read(T &t) {
t=0; char ch=getchar(); int f=1;
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1; ch=getchar(); }
do {
(t*=10)+=ch-'0'; ch=getchar(); } while ('0'<=ch&&ch<='9'); t*=f;
}
template <typename T> void write(T t) {
if (t<0) {
putchar('-'); write(-t); return; }
if (t>9) write(t/10);
putchar('0'+t%10);
}
template <typename T> void writeln(T t) {
write(t); puts(""); }
const int N = 110, mod = 998244353;
int a[N], n;
LL dp[N][N][N];//dp[j][k][l]表示前j个数选则k个数的和modi为l的方案数
int main()
{
read(n);
LL sum = 0;
for(int i = 1; i <= n; i ++ ) read(a[i]);
for(int i = 1; i <= n; i ++ ){
//一共选i个数 O(N^4)
dp[0][0][0] = 1;
for(int j = 1; j <= n; j ++ ){
for(int k = 0; k <= j; k ++ ){
for(int l = 0; l < i; l ++ ){
// 不选的方案数
dp[j][k][l] = (dp[j][k][l] + dp[j - 1][k][l]) % mod;
// 选的方案数
int x = a[j] % i;
if(k >= 1){
if(l - x >= 0) dp[j][k][l] = (dp[j][k][l] + dp[j - 1][k - 1][l - x]) % mod;
else dp[j][k][l] = (dp[j][k][l] + dp[j - 1][k - 1][i + l - x]) % mod;
}
}
}
}
sum += dp[n][i][0];
sum %= mod;
memset(dp, 0, sizeof dp);
}
printf("%lld\n",sum);
return 0;
}
边栏推荐
- LayaBox---TypeScript---Problems encountered at first contact
- visual studio 2015 warning MSB3246
- 【2022杭电多校5 1012题 Buy Figurines】STL的运用
- idea2021版本添加上一步和下一步操作到工具栏
- [2022 Hangzhou Electric Power Multi-School 5 1012 Questions Buy Figurines] Application of STL
- DSPE-PEG-Aldehyde,DSPE-PEG-CHO,磷脂-聚乙二醇-醛基一种疏水18碳磷脂
- PRIMAL: Pathfinding via Reinforcement and Imitation Multi-Agent Learning 代码解析
- OD-Model【6】:YOLOv2
- for 循环中的 ++i 与 i++
- Configure laravel queue method using fort app manager
猜你喜欢
随机推荐
MATLAB中readtimetable函数用法
JWT actively checks whether the Token has expired
链队
数据仓库(1)什么是数据仓库,数仓有什么特点
After encountering MapStruct, the conversion between PO, DTO and VO objects is no longer handwritten
动手学深度学习_NiN
win10 uwp 使用 WinDbg 调试
dotnet 启动 JIT 多核心编译提升启动性能
拼多多开放平台订单信息查询接口【pdd.order.basic.list.get订单基础信息列表查询接口(根据成交时间)】代码对接教程
知识分享|如何设计有效的帮助中心,不妨来看看以下几点
PowerCLi 批量配置NTP
顺序队列
How to train a deep learning model?
JWT主动校验Token是否过期
[2022 Hangzhou Electric Power Multi-School 5 1012 Questions Buy Figurines] Application of STL
ADB 安装 + 打驱动全教程
结构体小结
两种白名单限流方案(redis lua限流,guava方案)
PCBA方案设计——厨房语音秤芯片方案
Dotnet using WMI software acquisition system installation









