首页 > 其他分享 >[ABC262D] I Hate Non-integer Number 题解

[ABC262D] I Hate Non-integer Number 题解

时间:2023-02-15 18:55:46浏览次数:42  
标签:Non return int 题解 Number ret dp define

[ABC262D] I Hate Non-integer Number Solution

目录

更好的阅读体验戳此进入

题面

已知一个长度为 \(N\) 的数列 \(a_1,a_2,\cdots a_N\),从数列中选出至少一个数,使选出的数平均数为整数,求有多少种这样的方案。

Solution

经典DP,考虑设状态 $ dp(i, j, p, k) $,表示考虑前 $ i $ 个数里选 $ j $ 个的和模 $ p $ 余 $ k $。

转移显然,即:

\[dp(i, j, p, k) \rightarrow dp(i + 1, j, p, k) \]

\[dp(i, j, p, k) \rightarrow dp(i + 1, j + 1, p, (k + a_{i + 1}) \bmod{p}) \]

最终答案即为 $ \sum_{i = 1}^n dp(N, i, i, 0) $。

然后需要注意转移过程中存在 $ j = 0 $,但答案不可以 $ j = 0 $,原因显然。

初始值即为 $ dp(1, 0, i, 0) = 1, dp(1, 1, i, a_1 \bmod{i}) = 1 $。

发现空间无法支持,故可以将 $ i $ 维滚动掉。

Code

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

#define PI M_PI
#define E M_E
#define npt nullptr
#define SON i->to
#define OPNEW void* operator new(size_t)
#define ROPNEW(arr) void* Edge::operator new(size_t){static Edge* P = arr; return P++;}

using namespace std;

mt19937 rnd(random_device{}());
int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
bool rnddd(int x){return rndd(1, 100) <= x;}

typedef unsigned int uint;
typedef unsigned long long unll;
typedef long long ll;
typedef long double ld;

#define MOD (998244353ll)

template < typename T = int >
inline T read(void);

int N;
ll a[110];
ll dp[2][110][110][110];
ll ans(0);

int main(){
    N = read();
    for(int i = 1; i <= N; ++i)a[i] = read();
    for(int i = 1; i <= N; ++i)dp[1][0][i][0] = 1, dp[1][1][i][a[1] % i] = 1;
    for(int i = 1; i < N; ++i){
        for(int j = 0; j <= 100; ++j)for(int p = 0; p <= 100; ++p)for(int k = 0; k <= 100; ++k)dp[!(i & 1)][j][p][k] = 0;
        for(int j = 0; j <= i; ++j)
            for(int p = 1; p <= N; ++p)
                for(int k = 0; k < p; ++k)
                    (dp[!(i & 1)][j][p][k] += dp[i & 1][j][p][k]) %= MOD,
                    (dp[!(i & 1)][j + 1][p][(k + a[i + 1]) % p] += dp[i & 1][j][p][k]) %= MOD;
    }
    for(int i = 1; i <= N; ++i)(ans += dp[N & 1][i][i][0]) %= MOD;
    printf("%lld\n", ans);
    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

template < typename T >
inline T read(void){
    T ret(0);
    int flag(1);
    char c = getchar();
    while(c != '-' && !isdigit(c))c = getchar();
    if(c == '-')flag = -1, c = getchar();
    while(isdigit(c)){
        ret *= 10;
        ret += int(c - '0');
        c = getchar();
    }
    ret *= flag;
    return ret;
}

UPD

update-2023_01_07 初稿

标签:Non,return,int,题解,Number,ret,dp,define
From: https://www.cnblogs.com/tsawke/p/17124311.html

相关文章

  • 【题解】[Ynoi2013] 文化课
    题目分析:这个权值一看就可以使用线段树维护啊,因为很明显可以进行高效合并。对于区间合并其实就只是需要判断一下两个区间中间如果是乘号,那么造成的贡献要变成区间两边乘......
  • 【题解】CF280D k-Maximum Subsequence Sum
    题目分析:(可能是刚做完毒瘤Ynoi的原因,看这个4k的线段树感觉好简单)可以看一下这个查询的操作,最多\(k\)个不重线段的和的最大值,这个东西大概是网络流的经典题吧。具......
  • 【题解】Luogu P3939 数颜色
    题目分析:解法一:显然我们可以直接对每一种颜色建一棵线段树,然后剩下的操作就非常简单了。代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;constint......
  • ON1 NoNoise AI 2023 for mac(ai摄影降噪软件)v17.1.0.13508中文版
    ON1NoNoiseAIMac破解版是一款去除图像噪点的应用,特别对于摄影师来说,它是比较专业的摄影降噪软件。使用AI人工智能驱动的NoNoiseAI快速去除噪点并获得照片中最清晰......
  • hadoop之shuffle阶段相关面试题解析
    --思考1:map()方法写出的数据存储到哪里?                                  --内存中1、在内存中存有一个环形缓冲区,该缓冲......
  • [省选联考 2022] 填树 题解
    神奇dp。发现我看到dp大多数时候只会暴力。那我约等于退役了啊。题意:自己看。首先有一个显然的暴力。枚举一个最小值\(L\),然后区间就限定在了\([L,L+K]\)。那么普及......
  • NOIP2015 普及组 推销员题解
    原题链接给定一个数轴,数轴上有一些点,第\(i\)个点离起点的距离是\(S_i\),取走它要消耗\(A_i\)的代价,同时在数轴上每移动一格要\(1\)的代价,路线只能从数轴......
  • CSP2022 假期计划 题解
    给你一张\(n\)个点,\(m\)条边的无向图,每个点有点权,要求你在图中选出\(A\),\(B\),\(C\),\(D\)四个点,使得\(1\rightarrowA\rightarrowB\rightarrowC\righ......
  • DTOJ 2023.02.11 测试 题解
    DTOJ2023.02.11测试题解2023省选模拟Round#12\(100+8+50=158\)还行T2想到了,但是没写,我觉得写了也不一定写得出来,挺妙的T1题意http://59.61.75.5:18018/p/545......
  • 读者最需要什么样的题解
    哈哈,其实还是鲜花,主要是看到\(\text{f}\color{red}{\text{eecle6418}}\)的这篇题解有感而发,当然我自己写的题解也很抽象,需要改正。当然这里的写题解是指主动打算写一......