题意:

  给一个环,环上有n+m个点。给n个点染成B,m个点染成W。求所有染色情况的每段长度乘积之和。

题解:

  染成B的段数和染成W的段数是一样的(因为是环)。

  第一段是可以移动的,例如BBWWW移动为BWWWB。

  所以处理两个方程:b[i][j]代表把j分成i段的乘积和且第一段不能移动;f[i][j]代表把j分成i段的乘积和且第一段可以移动。

  那么枚举分成的段数,对于当前枚举分成i段,答案就为:f[i][n]*b[i][m]+f[i][m]*b[i][n].

  问题是方程怎么转移了。

  对于b[i][j],枚举一个新加的数(1~j-i+1),即b[i][j] = 1*b[i-1][j-1]+2*b[i-1][j-2]+...+(j-i+1)*b[i-1][i-1].

  对于f[i][j],确定他的第一个数是什么,然后枚举一个新加的数,即f[1][i] = i*i(确定第一个数);f[i][j] = 1*f[i-1][j-1]+2*f[i-1][j-2]+...+(j-i+1)*f[i-1][i-1].

  HDU上建2个数组会MLE,所以只能在camp上过2个数组的。camp题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU

#include <bits/stdc++.h>
using namespace std;
const int N = ;
const int mod = 1e9+;
typedef long long ll;
int n, m;
ll f[N][N], b[N][N];
ll ans;
int main() {
b[][] = ;
for(int i = ; i <= ; i++) {
ll sum = , res = ;
for(int j = i; j <= ; j++) {
res = (res+b[i-][j-])%mod;
sum = (sum+res)%mod;
b[i][j] = sum;
}
}
for(int i = ; i <= ; i++) f[][i] = (i*i)%mod;
for(int i = ; i <= ; i++) {
ll sum = , res = ;
for(int j = i; j <= ; j++) {
res = (res+f[i-][j-])%mod;
sum = (sum+res)%mod;
f[i][j] = sum;
}
}
while(~scanf("%d%d", &n, &m)) {
ans = ;
int up = min(m, n);
for(int i = ; i <= up; i++) {
ans = (ans+f[i][n]*b[i][m]+f[i][m]*b[i][n])%mod;
}
printf("%lld\n", ans);
}
}

  

  

最新文章

  1. freemarker页面中文乱码
  2. c/c++ string.h
  3. python 冒泡排序
  4. 实现窗体随着鼠标移动(控件)--《用delphi开发共享软件》-15.1任务管理器
  5. kali 密码攻击
  6. 纯HTML页面为了避免频繁前后台Ajax交互方案
  7. Sunglasses
  8. node.js:怎样同时执行多条SQLs,且只有一个回调
  9. springMVC项目在jboss7中配置应用自己的log4j--转载
  10. ☀【Zepto】
  11. codeforce 621C Wet Shark and Flowers
  12. android中数据存储
  13. Vue表单控件绑定
  14. DQN算法
  15. android 2018 面试题
  16. 替换富文本里的px为rem
  17. maven 项目打包到本地仓库并且推送到私服仓库
  18. Web服务端开发需要考虑的问题
  19. 哪个先执行:@PostConstruct和@Bean的initMethod?
  20. HTML的map-area的使用

热门文章

  1. 判断一个Object是否为数组Array的方法
  2. 使用工具Android Studio实现一个简单的Android版的新闻APP
  3. 高封装的property方法
  4. v-cloak
  5. PHP 面向对象 static 和 self 的区别
  6. python_字符串_常用处理
  7. linux select用法
  8. Spring---单例模式(Singleton)的6种实现
  9. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)
  10. SVN迁移到Git原因说明