首页 > 其他分享 >[AGC052C] Nondivisible Prefix Sums 题解

[AGC052C] Nondivisible Prefix Sums 题解

时间:2023-11-30 19:22:33浏览次数:39  
标签:ch int 题解 1ll Prefix res AGC052C tot1 mod

题目链接

点击打开链接

题目解法

好题!
一个序列是不合法的,必定满足某些结论,我们不妨猜测一下
首先如果和为 \(P\) 的倍数,必定不合法
然后手玩几个可以发现,最极限的情况是 \(P-1\) 个 \(1\;+\;\) \(b_i\; + \;\) \(P-b_i\)
如果在这个情况下再加一个 \(1\),就爆了
其中 \(1\) 可以替换为 \(P-1\) 个数,因为任何序列如果众数不为 \(1\),整体乘众数的逆元即可

考虑如何证明?

  1. 必要性。如果不满足,显然构造不出
  2. 充分性。
    考虑一种优秀的构造方案,每次如果能选众数填进去就填,不能就随便填一个数,这样一定会填成上面最极限的形式

对于和为 \(P\) 的倍数的序列,可以直接小小的容斥一下
如果不考虑最后一位不可填是 \((P-1)^{n-1}\),但倒数第二位的前缀和如果是 \(0\) 的话就不可填,一直往前推,不难得到容斥之后答案为 \(\sum\limits_{i=1}^{n-1}(-1)^{n-i}(P-1)^i\)

对于第二种情况如何求解
令 \(f_{i,j}\) 为选了 \(i\) 个 \(b\),\(\sum{P-b_k}\) 的 \(j\) 的方案数
不难用前缀和优化 \(dp\) 做到 \(O(n^2)\) 的复杂度
考虑合法的 \(i,j\) 的条件,即 \(n-i\ge P+j\) 且 \(n-i\not\equiv j(\mod P)\)
直接组合数算一算即可

时间复杂度 \(O(n^2)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=5100,mod=998244353;
int n,P,f[N][N],s[N][N];
int fac[N],ifac[N];
inline void inc(int &x,int y){ x+=y;if(x>=mod) x-=mod;}
int C(int x,int y){ return 1ll*fac[x]*ifac[y]%mod*ifac[x-y]%mod;}
int qmi(int a,int b){
    int res=1;
    for(;b;b>>=1){ if(b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;}
    return res;
}
int main(){
    n=read(),P=read();
    fac[0]=1;
    F(i,1,n) fac[i]=1ll*fac[i-1]*i%mod;
    ifac[n]=qmi(fac[n],mod-2);
    DF(i,n-1,0) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
    //sum % P = 0
    int res=1,tot1=0;
    F(i,1,n-1){
        res=1ll*res*(P-1)%mod;
        if((n-i)&1) tot1=(tot1+res)%mod;
        else tot1=(tot1-res+mod)%mod;
    }
    //otherwise
    int bound=0;
    F(i,0,n) if(n-i>1ll*(i+1)*(P-1)) bound=i;
    f[0][0]=1;
    F(j,0,n) s[0][j]=1; 
    F(i,1,n) F(j,1,n){
        f[i][j]=s[i-1][j-1];
        if(j-(P-1)>=0) f[i][j]=(f[i][j]-s[i-1][j-(P-1)]+mod)%mod;
        s[i][j]=(s[i][j-1]+f[i][j])%mod;
    }
    int tot2=0;
    F(i,0,n) F(j,0,n) if(n-i>=P+j&&(n-i-j)%P) inc(tot2,1ll*f[i][j]*C(n,i)%mod);
    tot2=1ll*tot2*(P-1)%mod;
    //tot
    int ans=1;
    F(i,1,n) ans=1ll*ans*(P-1)%mod;
    ans=(1ll*ans-tot1-tot2+2*mod)%mod;
    printf("%d\n",ans);
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:ch,int,题解,1ll,Prefix,res,AGC052C,tot1,mod
From: https://www.cnblogs.com/Farmer-djx/p/17868067.html

相关文章

  • CF689题解
    CF689CodeforcesRound361(Div.2)CF689AlinkCF689A题意题目描述迈克在海滩游泳时不小心将手机放入水中。他买了一个带有老式键盘的手机。键盘只有十个数字大小的键,位于以下方式:1234567890联系人与他的旧手机一起消失了,他现在只能记住他的手指......
  • 商家转账到零钱全攻略:开通、使用、区别与常见问题解答
    一、商家转账到零钱功能介绍微信作为中国最受欢迎的社交平台之一,其支付功能也相当强大。其中,商家转账到零钱功能可以让商家直接将款项转入用户的微信零钱,方便快捷。本文将详细介绍商家转账到零钱的功能、开通条件、使用方法以及常见问题解答。二、商家转账到零钱场景说明商家转......
  • axios(ajax)发送请求响应码200,但获取不到数据,无法加载响应数据: No datafound for res
    问题截图:没有响应数据控制台报错其实是由于浏览器的跨域资源共享(CORS)策略导致,前后端跨域请求是不行的。什么是域,看页面的url,比如https://www.baidu.com/下的网页都是属于baidu.com这个域。如果你是和我一样是从本地文件打开html的方式来调试ajax,那么一定会出现这个问题,因为本......
  • CF1846E2 Rudolf and Snowflakes (hard version) 题解
    题意:\(T\)\((\)\(1\)\(\le\)\(T\)\(\le\)\(10^4\)\()\)组询问:是否存在一个满\(k\)(\(k\)\(\ge\)\(2\)\()\)叉树节点数恰好为\(n\)\((\)\(1\)\(\le\)\(n\)\(\le\)\(10^{18}\)\()\),且深度\(depth\)至少为\(2\)。思路:满$k$......
  • luogu2839题解
    [国家集训队]middle题目分析代码如下。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;constintMAXN=2e4+10;intx,n,Q,a[MAXN],q[6],root[MAXN],b[MAXN],tot;vector<int>locp[MAXN];structSegmentTreeNode{......
  • CF1827C Palindrome Partition 题解
    题目链接点击打开链接题目解法首先考虑一个朴素的\(dp\)令\(f_i\)表示以\(i\)结尾的合法子串的个数为了不重不漏,我们令\(le_i\)表示以\(i\)为右端点,离\(i\)最近的偶回文串的左端点,然后不难得到转移为\(f_i=f_{le_i-1}+1\)为什么不会漏?考虑以\(i\)为右端点,且比......
  • NOIP2000提高组真题解析
    NOIP2000提高组真题解析第一题进制转换题目链接解析首先,我们知道对于10进制数x转2进制数,使用的算法是:求出x%2令x=x/2不断执行1,2,直至x为0,然后倒序输出步骤1的结果。一般可以用数组存步骤1的结果倒序输出或者使用dfs回溯回来再输出。对于负数的情况,比如\(-7=1*(-2)^3......
  • ISCTF 逆向题解
    ISCTF逆向题解用一个晚上的时间看了看ISCTF,有的题还蛮难的(毕竟得嘎嘎猜出题人想法)CrackMewinhex打开exe,修改标识头PFX为UPX然后放进UPXshell里面试试脱了,放进ida,直接反编译得到flagEasyReexeinfo看看这个是什么64位,放进ida反编译得到一段很清晰的逻辑反转+异或+单表代换。。。......
  • ICPC2022Xian L Tree 题解
    LinkICPC2022XianLTreeQuestion给出一个根为\(1\)的树,需要将树分成几个块每个块,一个块中的节点需要满足以下条件中的一个:对于所有的\(u,v\inS,\u\neqv\),满足\(u\insubtree(v)\)或\(v\insubtree(u)\)对于所有的\(u,v\inS,\u\neqv\),满足\(u\not......
  • LLM面面观之Prefix LM vs Causal LM
    1.背景关于PrefixLM和CausalLM的区别,本qiang在网上逛了一翻,发现多数客官只给出了结论,但对于懵懵的本qiang,结果仍是懵懵...因此,消遣了多半天,从原理及出处,交出了PrefixLM和CausalLM两者区别的更为清楚的说明。2.PrefixLMPrefixLM,即前缀语言模型,该结构是Google的T5模型论......