zoukankan      html  css  js  c++  java
  • 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp

    LINK:牛牛与序列

    (牛客div1的E题怎么这么水... 还没D难.

    定义一个序列合法 当且仅当存在一个位置i满足 (a_i>a_{i-1},a_j<a_{j-1})且对于所有的位置i,(1 leq a_ileq k)

    人话解释:一个合法序列 每个数字都在1~k之间 且有两个相邻数字是递增关系两个相邻数字是递减关系。

    发现我们枚举某两个位置递增递减再进行计数会重复 而且很难减掉重复方案。这个不能代表元容斥。

    考虑总方案-不合法方案。发现不合法方案就两种不增,不降.

    显然不增翻转一下就是不降 考虑求出不增的方案数 考虑从前往后放数字且数字大小递减 每个数字都可以分到一些位置。

    容易发现是一个隔板法 所以总方案数为C(n+k-1,k-1).

    值得注意的是 最后要加上k 因为所有数字都相同时 同时为不增和不降。

    这个组合数可以O(k)计算。可以通过此题。

    而题解上给了一个dp 这个dp也很显然f[i][j]表示前i个数字使用的最小数字为j的方案数。

    最后答案为(sum_{i=1}^{k}f[n][i]) 更扯得是 需要打标发现是上述的组合数 再接一个数学归纳法证明。

    我觉得很麻烦 可能正因为如此 出题人才把这道题放到E吧.

    const ll MAXN=100010;
    ll n,k,T;
    ll ans;
    inline ll ksm(ll b,ll p)
    {
    	ll cnt=1;
    	while(p)
    	{
    		if(p&1)cnt=cnt*b%mod;
    		b=b*b%mod;p=p>>1;
    	}
    	return cnt;
    }
    signed main()
    {
    	freopen("1.in","r",stdin);
    	get(T);
    	while(T--)
    	{
    		get(n);get(k);
    		ans=ksm(k,n%(mod-1))+k;
    		ll cnt=1,ww=1;
    		fep(n+k-1,n+1,i)cnt=cnt*i%mod,ww=ww*(i-n)%mod;
    		ww=ksm(ww,mod-2);
    		putl(((ans-cnt*ww%mod*2%mod)%mod+mod)%mod);
    	}
    	return 0;
    }
    
  • 相关阅读:
    mysql 插入字段 字符串
    python---统计列表中数字出现的次数
    pycharm激活
    Jmeter遇到的坑
    通用接口测试用例设计【转】
    selenium系列------元素定位套路
    jmeter系列-------注意事项
    jmeter系列-------脚本编写格式
    jmeter系列------变量的提取
    jmeter系列------参数关联
  • 原文地址:https://www.cnblogs.com/chdy/p/12740210.html
Copyright © 2011-2022 走看看