首页 > 其他分享 >Codeforces 286E Ladies' Shop

Codeforces 286E Ladies' Shop

时间:2024-02-27 16:46:31浏览次数:18  
标签:Shop Ladies return int Codeforces i64 constexpr inline mod

考虑 \(p_i\) 满足什么不会被选。
令当前选出来的 \(p_j\) 的集合为 \(S\)。
能发现当用 \(S\) 中的数能够凑(可多选,可选重)出 \(p_i\) 时 \(p_i\) 就不会被选。
考虑凑出 \(p_i\) 的最后一步所用的 \(2\) 个数 \(x + y = p_i\)。
因为这 \(2\) 个数一定能被 \(S\) 中的数凑出且题目中合法的条件为 \(S\) 中能凑出来 \(\le m\) 的数都必须出现在 \(p\) 中,所以 \(x, y\) 就会出现在 \(p\) 种。
即是存在 \(j, k\) 满足 \(p_j + p_k = p_i\),\(p_i\) 就不会被选。

考虑把判定存在转为方案数,即判断有多少组 \(j, k\) 满足 \(p_j + p_k = p_i\)。
令 \(p_i\) 的集合为 \(P\),记 \(f(x) = \sum\limits_{i = 0}^x [i\in P][x - i\in P]\),即判断 \(f(p_i)\) 是否 \(> 0\) 即可。
能发现这个式子很像多项式。
于是令 \(G(x) = \sum\limits_{i = 0}^m [i\in P]x^i, F(x) = \sum\limits_{i = 0}^m f(i)x^i\),有 \(F(x) = G^2(x)\)。
用 \(\text{NTT}\) 即可。

时间复杂度 \(O(m\log m)\)。

#include<bits/stdc++.h>
using i64 = long long;
constexpr i64 mod = 998244353, G = 3;
constexpr inline i64 qpow(i64 a, i64 b) {i64 v = 1; while (b) b & 1 && ((v *= a) %= mod), (a *= a) %= mod, b >>= 1; return v;}
constexpr inline i64 inv(i64 a) {return qpow(a, mod - 2);}
constexpr i64 invG = inv(G);
inline i64 Mod(i64 x) {return x >= mod ? (x - mod) : x;}
inline i64 Mod(i64 x, i64 y) {return Mod(x + y);}
inline i64 Modf(i64 x, i64 y) {return Mod(x + mod - y);}
const int maxn = (1 << 21) + 10;
inline int pw2N(int n) {int N = 1; while (N <= n) N <<= 1; return N;}
inline void NTT(i64 *f, int n, bool isI) {
    static int rev[maxn]; static i64 th[maxn];
    for (int i = 1; i < n; i++) rev[i] = (rev[i >> 1] >> 1) | (i & 1 ? (n >> 1) : 0);
    for (int i = 0; i < n; i++) i < rev[i] && (std::swap(f[i], f[rev[i]]), 1);
    for (int len = 1; len < n; len <<= 1) {
        i64 I = qpow(isI ? invG : G, (mod - 1) / len / 2);
        th[0] = 1;
        for (int i = 1; i < len; i++) th[i] = th[i - 1] * I % mod;
        for (int s = 0; s < n; s += len + len) for (int t = 0; t < len; t++) {
            i64 v = th[t] * f[s | t | len] % mod;
            f[s | t | len] = Modf(f[s | t], v), f[s | t] = Mod(f[s | t], v);
        }
    }
    if (isI) {
        i64 invn = inv(n);
        for (int i = 0; i < n; i++) (f[i] *= invn) %= mod;
    }
}
i64 f[maxn];
bool vis[maxn];
int main() {
    int n, m; scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        int x; scanf("%d", &x);
        f[x] = 1, vis[x] = 1;
    } 
    int N = pw2N(m << 1);
    NTT(f, N, 0);
    for (int i = 0; i < N; i++) (f[i] *= f[i]) %= mod;
    NTT(f, N, 1);
    for (int i = 0; i <= m; i++) if (! vis[i] && f[i]) return puts("NO"), 0;
    std::vector<int> P;
    for (int i = 0; i <= m; i++) vis[i] && ! f[i] && (P.push_back(i), 1);
    printf("YES\n%zu\n", P.size());
    for (int x : P) printf("%d ", x);
    return 0;
}

标签:Shop,Ladies,return,int,Codeforces,i64,constexpr,inline,mod
From: https://www.cnblogs.com/rizynvu/p/18037187

相关文章

  • Codeforces Round 909 (Div
    CodeforcesRound909(Div.3)A.GamewithIntegers显然就是还要不是三的倍数就能赢!intn; cin>>n; intk; while(n--) { cin>>k; if(k%3==0){ cout<<"Second"<<endl; }else{ cout<<"First"<<endl; } }B......
  • Codeforces Round 905 (Div
    CodeforcesRound905(Div.3)A.Morning此题将其看为光标一直移动,其中移动次数就是坐标之差的绝对值,0看做10,由于其显示也需一次操作,所以加上四。#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt; cin>>t; while(t--) { intarr[4],count=0; ......
  • Codeforces Round 900 (Div
    CodeforcesRound900(Div.3)A.HowMuchDoesDaytonaCost?这个题简单,在子段上最常见的元素其实只要这个元素出现就行intt; cin>>t; intn,k; while(t--) { cin>>n>>k; intarr[n]; intout=0; for(inti=0;i<n;i++) { cin>>arr[i]; } for(......
  • Codeforces Round 888 (Div
    CodeforcesRound888(Div.3)A.EscalatorConversations推导即可,判断条件就是abs(h[i]-H)%k==0&&abs(h[i]-H)/k<m&&h[i]!=H,先要整除再能相隔abs(h[i]-H)/k个台阶谁高谁矮任意不影响,但是最后这个我就没注意到h[i]!=H小卡一会。#include<bits/stdc++.h>usingnamespacestd;......
  • Codeforces 1906L Palindromic Parentheses
    考虑先判定有无解对应的\(k\)的范围。首先若\(k=n\)一定无解,因为字符串开头是\(\texttt{(}\)结尾是\(\texttt{)}\)匹配不上。下界因为各有\(\frac{n}{2}\)个\(\texttt{()}\),所以可以先猜测下界就为\(\frac{n}{2}\)。考虑构造到这个下界。能发现只需要形如\(\te......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    Preface开学了没时间组队训练就抽空把之前欠下的CF补一补这场当时玩《拔作岛》上头了忘记有比赛了,等想起来的时候已经快结束了就没现场打赛后补题发现A~E都很简单,F的话一个地方没太想清看了题解才会A.MovingChips签到,找一个极小的且包含了所有\(1\)的区间,这个区间中\(0\)......
  • Codeforces 1451F Nullify The Matrix
    因为保证了这个路径必须是向下和向右,就可以考虑每一条\(i+j=x\)的斜线上的点,因为一条路径经过的点对应的\(i+j\)一定是每次\(+1\)的。考虑到因为对于同一条直线,每个点是独立的,因为一条路径至多经过这条直线上的一个点。于是可以考虑用\(\text{Nim}\)的思想把这条......
  • CF1923 Educational Codeforces Round 162 (Rated for Div. 2)
    C.FindB给出一个数组A,对于q个询问,每个询问给出[l,r],对于A的子数组[l,r],问是否存在一个相同大小的数组B,使得两个数组的和相同,且任意相同下标的元素不同?Solution:A中任意一个大于1的元素,可以把他变成1,多余的那部分给到其他位置的元素上(如最后一个)对于等于1的元素,把......
  • CF1932 Codeforces Round 927 (Div. 3)
    E.FinalCountdown我愿称之为今年最傻逼的一次,思路很快想出来了,但是实现一直搞不对观察发现答案是n的所有前i位数相加(如12345,那么ans=12345+1234+123+12+1)要证明的话就是按照题目的Note那样算,(以12345为例,ans=(12345-1234-123-12-1)+21234+2123+212+21)然后傻逼的事情......
  • 【Django开发】0到1开发美多shop项目:用户登录模块开发。全md文档笔记(附代码 文档)
    本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django+Jinja2模板引擎+Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsg......