• 【YbtOJ#20067】糖果分配


    题目

    题目链接:http://noip.ybtoj.com.cn/contest/102/problem/1

    思路

    可以视作将 (m) 个位置分成 (n) 份,第 (i) 份上需要填上相同且在 ([l_i,r_i]) 中的数的积的和。
    所以可以设 (f[i][j][k]) 表示前 (j) 个位置,填了前 (i) 个数所有方案积的和。
    那么有

    [f[i][j]=f[i-1][k]+sum^{r_i}_{p=l_i}(i^{j-k}) ]

    时间复杂度 (O(nm^2))

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N=410,MOD=1e9+7;
    int n,m,ans,l[N],r[N],f[N][N],g[N][N],power[N][N];
    
    int main()
    {
    	freopen("candy.in","r",stdin);
    	freopen("candy.out","w",stdout);
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=400;i++)
    	{
    		power[i][0]=1;
    		for (int j=1;j<=m;j++)
    			power[i][j]=1LL*power[i][j-1]*i%MOD;
    	}
    	for (int i=1;i<=n;i++) scanf("%d",&l[i]);
    	for (int i=1;i<=n;i++) scanf("%d",&r[i]);
    	for (int i=1;i<=n;i++)
    		for (int j=0;j<=m;j++)
    			for (int k=l[i];k<=r[i];k++)
    				g[i][j]=(g[i][j]+power[k][j])%MOD;
    	f[0][0]=1;
    	for (int i=1;i<=n;i++)
    		for (int j=0;j<=m;j++)
    			for (int k=0;k<=j;k++)
    				f[i][j]=(f[i][j]+1LL*f[i-1][k]*g[i][j-k])%MOD;
    	printf("%d",f[n][m]);
    	return 0;
    }
    
  • 相关阅读:
    ubuntu命令
    mac获取root权限
    centos7安装解压缩工具 ncompress
    ubuntu17.04 配置go环境变量
    vue.js 拦截器
    ubuntu 安装jdk
    ubuntu安装deb文件
    初识 阿里云 SSL 证书申请
    java之XML
    LanProxy 内网映射穿透
  • 原文地址:https://www.cnblogs.com/stoorz/p/13841924.html
Copyright © 2020-2023  润新知