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;
    }
    
  • 相关阅读:
    VS 2008 和 .NET 3.5 Beta 2 发布了
    搭建.NET 3.0环境
    Expression Studio和Silverlight学习资源、安装问题汇总
    Discuz! NT官方社区
    VS2005中ajax安装指南[转]
    IT人 不要一辈子靠技术生存(转)
    Discuz!NT2.5发布 正式版同步开源
    VS2005下开发Silverlight 1.1翻译加补充
    自动化测试案例
    [原]JavaScript必备知识系列开篇
  • 原文地址:https://www.cnblogs.com/chdy/p/12740210.html
Copyright © 2011-2022 走看看