• AGC041D Problem Scores


    很久以前,yc 是个菜鸡,面对 AGC049D 一筹莫展,在巨神 vxlimo 的指点下才终于会了。

    过了几个月,yc 觉得自己很强,就在此时又受到了 XVIII Open Cup of Ural D 的攻击。巨神 vxlimo 大手一挥,yc 便认识到了自己的渺小。

    后来,yc 又看到了这题。吸收了之前的教训,yc 能干掉它吗?

    题目
    构造一个值域为 ([1,n]),长度为 (n) 的单调不降序列 (a_1,a_2,cdots,a_n),并且使得 (forall 1leq kleq n-1),都有任意 (k) 个数之和小于任意 (k+1) 个数之和。
    求构造方案数,对 (M) 取模。
    (2le nle 5000,9 imes 10^8<M<10^9)(M) 是质数。

    题解:

    容易发现:

    • (n) 为偶数:只要前 (frac{n}2) 个数之和大于后 (frac{n-2}2) 个数之和;
    • (n) 为奇数:只要前 (frac{n+1}2) 个数之和大于后 (frac{n-1}2) 个数之和。

    (n) 为偶数的情况略微复杂于 (n) 为奇数的情况,故以 (n) 为偶数为例。

    只要后 (frac{n-2}2) 个数之和减去前 (frac{n}2) 个数之和为负(记为 (m))。

    (b_i=egin{cases}-a_i&(ile frac n2)\0&(i=frac{n+2}2)\a_i&(i>frac{n+2}2)end{cases})

    那么 (a) 序列和 (b) 序列是一一对应的。因此只要算有多少这样的 (b) 序列它的总和为负。


    对于单调不降序列的计数,有这样一个套路:

    ( exttt{0 0 0}cdots exttt{0 0 0}\ exttt{0 0 0}cdots exttt{0 0 1}\ exttt{0 0 0}cdots exttt{0 1 1}\ cdots\ exttt{0 0 1}cdots exttt{1 1 1}\ exttt{0 1 1}cdots exttt{1 1 1}\ exttt{1 1 1}cdots exttt{1 1 1} )

    这是 (n+1) 个长度为 (n) 的 01 串。

    那么一个长度为 (n) 值域为 ([1,n]) 的序列 可以对应 从以上 01 串取出 (n) 个来相加的一种方案(一个串可以取多次,最后一个串至少取一次)。

    因此完全背包即可。


    这时考虑刚刚那个计算 (b) 序列的个数的问题,类似构造这样的串 (以下是 (n=6) 的情况):

    ( exttt{ 0 0 0 0 0 0}\ exttt{ 0 0 0 0 0 1}\ exttt{ 0 0 0 0 1 1}\ exttt{ 0 0 0 0 1 1}\ exttt{ 0 0 -1 0 1 1}\ exttt{ 0 -1-1 0 1 1}\ exttt{-1 -1-1 0 1 1} )
    (虽然有两个串长得一模一样,但视为不同)

    只要算,从以上串中取出 (n) 个来相加(一个串可以取多次,最后一个串至少取一次)且总和小于 (0) 的方案数。

    又只跟总和有关,所以又等价于从 (0,1,2,cdots,2,1,0,-1) 中取出 (n) 个来相加,总和小于 (0) 的方案数。(对 (n) 为奇数的情况,这个对应是差不多的)

    注意到只有最后一个是负的,因此想要总和小于 (0) 就一定选了最后一个,这个限制相当于没有用。

    先对非负的串做 DP,(f_{i,j,k}) 表示前 (i) 个串,取了 (j) 个,和为 (k) 的方案数。

    答案即为 (sum_{j,k}f_{n,j,k}[k-(n-j)<0]=sum_{j,k}f_{n,j,k}[j+k<n])

    由于答案只和 (j+k) 有关,把 (j)(k) 合成一维,就是一个完全背包,(O(n^2))

    #include<bits/stdc++.h>
    const int N=5003;
    int n,M,f[N],s;
    int main(){
    	scanf("%d%d",&n,&M);
    	f[0]=1;
    	for(int i=1,a;i<=n;i++){
    	  a=std::min(i,n-i+1);
    	  for(int j=a;j<n;j++)f[j]=(f[j]+f[j-a])%M;
    	}
    	for(int i=0;i<n;i++)s=(s+f[i])%M;
    	printf("%d
    ",s);
    	return 0;
    }
    
  • 相关阅读:
    Unix系统中system函数的返回值
    vim 插件 for gbasic
    arch初认识
    TI IPNC Web网页之进阶修改
    Ti IPNC Web网页之ActiveX控件
    TI IPNC Web网页之网页修改教程
    OI,再见
    [OI]省选前模板整理
    OI刷题录——hahalidaxin
    51nod 小Z的trie(Trie+广义SAM)
  • 原文地址:https://www.cnblogs.com/Camp-Nou/p/14437375.html
Copyright © 2020-2023  润新知