• AGC009:Eternal Average


    传送门
    好神啊
    直接考虑一棵 (n+m) 个叶子的 (k) 叉树,根结点权值为 (sum_{iin m}(frac{1}{k})^{deep_i})
    对于一个 (deep) 的序列
    如果 (sum_{iin m}(frac{1}{k})^{deep_i}+sum_{iin n}(frac{1}{k})^{deep_i}=1)
    那么一定可以构造出一棵 (k) 叉树满足要求
    (从deep大到小考虑,除去 (k) 进位)
    那么对于一个答案数 (x),它的每一位的数字(可以通过退位)和 (=m)
    退位就是 (+k-1),那么也就是 (sumequiv m(mod~k-1))
    同理 (1-x) 的每一位的数字(可以通过退位)和 (=n)
    设位数为 (l)
    (l(k-1)+1-sumequiv n(mod~k-1))
    那么可以设 (f_{i,j}) 表示小数点后前 (i) 位,每一位的数字和为 (j),的不同的数字个数
    每次判断 (jle m,i(k-1)+1-jle n)(jequiv m(mod~k-1),l(k-1)+1-jequiv n(mod~k-1))
    满足则贡献答案
    (i) 只需要枚举到 (n+m) 即可
    (dp) 只需要前缀和优化,注意要记录后缀 (0)

    # include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int maxn(2005);
    const int mod(1e9 + 7);
    
    inline void Inc(int &x, int y) {
        x = x + y >= mod ? x + y - mod : x + y;
    }
    
    inline void Dec(int &x, int y) {
        x = x - y < 0 ? x - y + mod : x - y;
    }
    
    inline int Add(int x, int y) {
        return x + y >= mod ? x + y - mod : x + y;
    }
    
    inline int Sub(int x, int y) {
        return x - y < 0 ? x - y + mod : x - y;
    }
    
    int n, m, k, f[maxn << 1][maxn][2], ans, s[maxn][2];
    
    inline int Check(int len, int sum) {
    	return sum % k == m % k && (len * k + 1 - sum) % k == n % k && len * k + 1 - sum <= n;
    }
    
    int main() {
    	int i, j, r, t;
    	scanf("%d%d%d", &n, &m, &k), r = n + m, f[0][0][0] = 1, --k;
    	for (i = 1; i <= r; ++i) {
    		for (t = 0; t < 2; ++t)
    			for (s[0][t] = f[i - 1][0][t], j = 1; j <= m; ++j)
    				s[j][t] = Add(s[j - 1][t], f[i - 1][j][t]);
    		for (j = 0; j <= m; ++j) f[i][j][1] = Add(f[i - 1][j][0], f[i - 1][j][1]);
    		for (j = 1; j <= m; ++j)
    			for (t = 0; t < 2; ++t)
    				Inc(f[i][j][0], Sub(s[j - 1][t], j > k ? s[j - k - 1][t] : 0));
    		for (j = 0; j <= m; ++j) if (Check(i, j)) Inc(ans, f[i][j][0]);
    	}
    	printf("%d
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    linux C程序中获取shell脚本输出(如获取system命令输出)
    Vue实现网页在线拍照和上传 幸福n
    c# thread数线程的创建多线程(一)
    C#开启异步 线程的四种方式(二)
    web学习网站
    C#中的set和get方法
    C# 多线程之Task任务(三)
    Taro3 扫描不同二维码参数不同,但是热启动之后参数不变
    Taro 弹窗阻止小程序滑动穿透(亲测有效) tabbar数据缓存不更新 入口场景值不同
    《Webpack+Babel入门与实例详解》出版了
  • 原文地址:https://www.cnblogs.com/cjoieryl/p/10357644.html
Copyright © 2020-2023  润新知