• AGC009E Eternal Average


    atc

    神题orz

    那个擦掉(k)个数然后写上一个平均值可以看成是(k)叉Huffman树的构造过程,每次选(k)个点合成一个新点,然后权值设为平均值.这些0和1都会在叶子的位置,同时每个叶子(i)的贡献为(w_i)(0或1)(*{frac{1}{k}}^{dep_i}),也就是每过一层这个叶子代表的0或1就要除掉(k)加到答案里,这样子算,所有点的贡献之和正好是最终的平均值.还要满足(sum_{i=1}^{n}{frac{1}{k}}^{dep_i}+sum_{j=1}^{m}{frac{1}{k}}^{dep_j}=1),相当于如果全是1那么最后的值也是1.那么(z)能被表示成最终的值当且仅当(z)能表示成(m)({frac{1}{k}}^{a_i})之和,以及(1-z)能表示成(n)({frac{1}{k}}^{b_i})之和

    如果把最终的值写成(k)进制小数,也就是(0.c_1c_2...c_l),那么(sum c=m),当然这是没考虑进位,每次进位会导致一个(c_ige k)(c_i)(k),并且对应的(c_{i-1})(1),那么每次进位都会导致(sum c)减去(k-1),所以条件就要改为(sum c equiv m mod k-1).然后(1-z)(sum c)应该是(l(k-1)+1-sum c),其中前半部分为整数1的(k)进制表示,所以在满足上述条件的情况下还满足(l(k-1)+1-sum c < n)以及(l(k-1)+1-sum c equiv n mod k-1)

    然后dp求方案数.设(f_{i,j})为考虑(i)位,(sum c)(j)的方案.注意我们要强制最后一位(>0),不然会和前面的方案算重,再加一维(0/1)表示末尾是(0)还是(>0)即可.转移可以前缀和优化

    #include<bits/stdc++.h>
    #define LL long long
    #define uLL unsigned long long
    #define db double
    
    using namespace std;
    const int N=2000+10,mod=1e9+7;
    int rd()
    {
        int x=0,w=1;char ch=0;
        while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
        return x*w;
    }
    int n,m,kk,f[2][N][2],pr[N],ans;
    
    int main()
    {
    	n=rd(),m=rd(),kk=rd();
    	int nw=1,la=0;
    	f[0][0][0]=1;
    	int lm=max(n,m)<<1;
    	for(int i=1;i<=lm;++i)
    	{
    		for(int j=0;j<=m;++j)
    		{
    			pr[j]=j?pr[j-1]:0;
    			pr[j]=(pr[j]+(f[la][j][0]+f[la][j][1])%mod)%mod;
    			f[la][j][0]=f[la][j][1]=0;
    		}
    		for(int j=0;j<=m;++j)
    		{
    			f[nw][j][0]=(pr[j]-(j?pr[j-1]:0)+mod)%mod;
    			if(j) f[nw][j][1]=(pr[j-1]-(j-(kk-1)-1<0?0:pr[j-(kk-1)-1])+mod)%mod;
    			if(j%(kk-1)==m%(kk-1)&&(i*(kk-1)+1-j)%(kk-1)==n%(kk-1)&&i*(kk-1)+1-j<=n)
    				ans=(ans+f[nw][j][1])%mod;
    		}
    		nw^=1,la^=1;
    	}
    	printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    stringify 字符串转化成json方法
    leetcode每日刷题计划-简单篇day22
    leetcode每日刷题计划-简单篇day21
    leetcode每日刷题计划-简单篇day20
    leetcode每日刷题计划-简单篇day19
    leetcode每日刷题计划-简单篇day18
    leetcode每日刷题计划-简单篇day17
    leetcode每日刷题计划-简单篇day16
    leetcode每日刷题计划-简单篇day15
    leetcode每日刷题计划-简单篇day14
  • 原文地址:https://www.cnblogs.com/smyjr/p/11584814.html
Copyright © 2020-2023  润新知