topcoder srm 684 div1
problem1 link
首先由$P$中任意两元素的绝对值得到集合$Q$。然后枚举$Q$中的每个元素作为集合$D$中的最大值$Max$,这样就能确定最后集合$D$中的最小值要大于等于$Min=\frac{Max+k-1}{k}$。然后再枚举$S$中元素的最小值即可依次从小到大确定$S$中的所有值。因为假设$S$中最小的元素是$x$,且当前最大元素是$y$,那么对于一个元素$z,z>y$,要么不选它;如果要选进来就要满足$z-x\leq Max$且$z-y\geq Min$。这样可以用一个简单的dp来解决。
problem2 link
设$s_{i}$表示连续$i$个元素任意两个相邻元素$x,y$满足$x>y$且$x$%$y$=0的方案数。$s$数组可以通过简单的dp来计算得到。
$f_{x}$表示长度为$x$的数组$A$的方案数。答案为$f_{n}$。$f_{0}=1$,$f_{t}=\sum_{r=1}^{t}f_{t-r}s_{r}(-1)^{r+1}=f_{t-1}s_{1}-f_{t-2}s_{2}+f_{t-3}s_{3}...$.其中$s_{1}=k$。
这个容斥可以这样理解:首先不理会$A_{n-1}$和$A_{n}$的关系,那么$A_{n}$有$s_{1}=k$种选择,所以$f_{n}=f_{n-1}s_{1}$。这样会导致$f_{n-1},f_{n}$不满足第二个条件,那么$f_{n-2}s_{2}$包含了所有的这种情况,同时$f_{n-2}s_{2}$还包含了$f_{n-2}$和$f_{n-1}$不满足第二个条件的情况,所以减去$f_{n-2}s_{2}$然后继续向后计算。
由于$k$最多只有$50000$,那么最多只会出现连续 16个数字是倍数关系,也就是说当$r>16$时$s_{r}=0$。所以$f_{t}=\sum_{r=1}^{min(t,16)}f_{t-r}s_{r}(-1)^{r+1}$
problem3 link
枚举排列的第一个数字。所有的情况都要乘上$m!$,所以把它最后再乘。
当$n=2$时,设为$a_{1},a_{2}$,那么答案为$\frac{1}{a_{1}+a_{2}}=a_{2}^{-1}\left (\frac{1}{a_{1}+a_{2}} \right )$
当$n=3$时,设为$a_{1},a_{2},a_{3}$,那么第一个固定时答案为
$\frac{1}{(a_{1}+a_{2})(a_{1}+a_{2}+a_{3})}+\frac{1}{(a_{1}+a_{3})(a_{1}+a_{3}+a_{2})}$
$=a_{3}^{-1}\left ( (a_{1}+a_{2})^{-1}-(a_{1}+a_{2}+a_{3})^{-1} \right )+a_{2}^{-1}\left ( (a_{1}+a_{3})^{-1}-(a_{1}+a_{3}+a_{2})^{-1} \right )$
$=(a_{2}a_{3})^{-1}\left ( \frac{a_{2}}{a_{1}+a_{2}}+\frac{a_{3}}{a_{1}+a_{3}}-\frac{a_{2}+a_{3}}{a_{1}+a_{2}+a_{3}} \right )$
当$n=4$时,前两项为$a_{1},a_{2}$时,后两项有两种组合,和为$(a_{3}a_{4})^{-1}\left ( \frac{a_{3}}{a_{1}+a_{2}+a_{3}}+\frac{a_{4}}{a_{1}+a_{2}+a_{4}}-\frac{a_{3}+a_{4}}{a_{1}+a_{2}+a_{3}+a_{4}} \right )$,这相当于$a_{1}+a_{2}$是$n=3$时的$a_{1}$。
所以对答案的贡献为$\frac{1}{a_{1}+a_{2}}(a_{3}a_{4})^{-1}\left ( \frac{a_{3}}{a_{1}+a_{2}+a_{3}}+\frac{a_{4}}{a_{1}+a_{2}+a_{4}}-\frac{a_{3}+a_{4}}{a_{1}+a_{2}+a_{3}+a_{4}} \right )$
$=(a_{3}a_{4})^{-1}\left ( \frac{1}{a_{1}+a_{2}}-\frac{1}{a_{1}+a_{2}+a_{3}}+\frac{1}{a_{1}+a_{2}}-\frac{a_{1}}{a_{1}+a_{2}+a_{4}}-(\frac{1}{a_{1}+a_{2}}-\frac{1}{a_{1}+a_{2}+a_{3}+a_{4}}) \right )$
$=(a_{3}a_{4})^{-1}\left ( \frac{1}{a_{1}+a_{2}}-\frac{1}{a_{1}+a_{2}+a_{3}}-\frac{1}{a_{1}+a_{2}+a_{4}}+\frac{1}{a_{1}+a_{2}+a_{3}+a_{4}} \right )$
$=(a_{2}a_{3}a_{4})^{-1}\left ( \frac{a_{2}}{a_{1}+a_{2}}-\frac{a_{2}}{a_{1}+a_{2}+a_{3}}-\frac{a_{2}}{a_{1}+a_{2}+a_{4}}+\frac{a_{2}}{a_{1}+a_{2}+a_{3}+a_{4}} \right )$
所以加上前两项是$a_{1},a_{3}$以及$a_{1},a_{4}$,总的答案为
$(a_{2}a_{3}a_{4})^{-1}\left ( \frac{a_{2}}{a_{1}+a_{2}}+\frac{a_{3}}{a_{1}+a_{3}}+\frac{a_{4}}{a_{1}+a_{4}}-\frac{a_{2}+a_{3}}{a_{1}+a_{2}+a_{3}}-\frac{a_{2}+a_{4}}{a_{1}+a_{2}+a_{4}}-\frac{a_{3}+a_{4}}{a_{1}+a_{3}+a_{4}}+\frac{a_{2}+a_{3}+a_{4}}{a_{1}+a_{2}+a_{3}+a_{4}} \right )$
所以对于$n$项来说,第一项为$a_{1}$的答案为$\sum_{p\in P}(-1)^{1+|p|}\frac{\sum_{x\in p}x}{a_{1}+\sum_{x\in p}x}$。其中$P$表示$a_{2},a_{3},..,a_{n}$的任意非空子集的集合。理论上有$2^{n-1}-1$个。但是由于所有的数字之和最多为1000,所以可以直接统计和为$y$的有多少种。
code for problem1
#include <algorithm>
#include <vector> class CliqueParty {
public:
int maxsize(std::vector<int> A, int k) {
int n = static_cast<int>(A.size());
std::sort(A.begin(), A.end());
std::vector<int> a;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
a.push_back(A[j] - A[i]);
}
}
std::sort(a.begin(), a.end());
auto Cal = [&](const int Max) {
const int Min = (Max + k - 1) / k;
int ans = 0;
for (int k = 0; k < n; ++k) {
std::vector<std::vector<int>> f(n, std::vector<int>(n, -1));
f[k][k] = 1;
for (int i = k + 1; i < n; ++i) {
for (int j = k; j <= i - 1; ++j) {
f[i][j] = f[i - 1][j];
if (f[i - 1][j] != -1 && A[i] - A[j] >= Min && A[i] - A[k] <= Max) {
f[i][i] = std::max(f[i][i], f[i - 1][j] + 1);
}
}
}
for (int i = k; i < n; ++i) {
ans = std::max(ans, f[n - 1][i]);
}
}
return ans;
};
int result = 0;
for (size_t i = 0; i < a.size(); ++i) {
if (i == 0 || a[i] != a[i - 1]) {
result = std::max(result, Cal(a[i]));
}
}
return result;
}
};
code for problem2
#include <vector> class DivFree {
public:
int dfcount(int n, int k) {
constexpr int kMaxT = 16;
constexpr int kMod = 1000000007;
std::vector<std::vector<int>> f(kMaxT + 1, std::vector<int>(k + 1));
std::vector<int> s(kMaxT + 1);
for (int i = 1; i <= k; ++i) {
f[1][i] = 1;
}
s[1] = k;
auto Add = [&](int &x, int y) {
x += y;
if (x >= kMod) {
x -= kMod;
}
};
for (int i = 2; i <= kMaxT; ++i) {
for (int j = 1; j <= k; ++j) {
for (int t = j + j; t <= k; t += j) {
Add(f[i][t], f[i - 1][j]);
}
}
for (int j = 1; j <= k; ++j) {
Add(s[i], f[i][j]);
}
}
std::vector<int> dp(n + 1);
dp[0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= kMaxT && j <= i; ++j) {
int k = static_cast<int>(1ll * dp[i - j] * s[j] % kMod);
if (j % 2 == 1) {
Add(dp[i], k);
} else {
Add(dp[i], kMod - k);
}
}
}
return dp[n];
}
};
code for problem3
#include <algorithm>
#include <vector> class Permutant {
public:
int counthis(const std::vector<int> &a) {
constexpr int kMod = 1000000007;
int n = static_cast<int>(a.size());
int s = std::accumulate(a.begin(), a.end(), 0);
std::vector<long long> inv(s + 1);
inv[1] = 1;
for (int i = 2; i <= s; ++i) {
inv[i] = (kMod - kMod / i) * inv[kMod % i] % kMod;
}
auto Add = [&](int &x, long long y) {
x += static_cast<int>(y % kMod);
if (x >= kMod) {
x -= kMod;
}
};
int result = 0;
for (int t = 0; t < n; ++t) {
std::vector<std::vector<std::vector<int>>> dp(
n + 1, std::vector<std::vector<int>>(2, std::vector<int>(s + 1)));
dp[0][0][0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 2; ++j) {
for (int k = 0; k <= s; ++k) {
Add(dp[i + 1][j ^ 1][k + a[i]], dp[i][j][k]);
if (i != t) {
Add(dp[i + 1][j][k], dp[i][j][k]);
}
}
}
}
int num = 0;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j <= s; ++j) {
long long x = inv[j] * (j - a[t]) % kMod;
if (i == 0) {
Add(num, x * dp[n][i][j] % kMod);
} else {
Add(num, (kMod - x) * dp[n][i][j] % kMod);
}
}
}
for (int i = 0; i < n; ++i) {
if (i != t) {
num = static_cast<int>(inv[a[i]] * num % kMod);
}
}
Add(result, num);
}
if (n == 1) {
result = 1;
}
for (int i = 1; i <= s; ++i) {
result = static_cast<int>(1ll * result * i % kMod);
}
return result;
}
};
topcoder srm 684 div1的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
随机推荐
- VS基本学习之(变量与常量)
一.变量与常量 1) 变量 由(定义+赋值+取值组成) 变量的命名规则: ① 变量名组成:字母 数字 下划线 @ 汉字 ② 首字母只能用:字母 下划线 @ 汉字(不能是数字 ...
- struts2实现XML异步交互
异步交互,在不用重新提交整个页面的情况下可以实现页面局部信息与服务器的交互.在编写异步交互时需要用到一个架包:dom4j,下载地址为:https://dom4j.github.io/ 下面通过例子说明 ...
- 有关g++的Xlinker选项
事情的起因是,在使用Eclipse配置opencv的库时,发现使用-Wl 选项需要自己在Linker flags的输入框里指定.并不是像使用-l选项或-I选项那样可以直接添加选项的条目就可以了.但是在 ...
- Unity shader学习之菲涅耳反射
菲涅尔反射(Fresnel reflection),指光线照射物体表面时,一部分发生反射,一部分进入物体内部发生折射或散射,被反射的光和折射光之间存在一定的比率. 2个公式: 1. Schlick 菲 ...
- eclipse设置字体_字符编码_快捷键
eclipse设置字体.字符编码.快捷键 1.设置字体: preferences->general->appearnce->colors and fonts-->basic-- ...
- Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
1.问题场景描述:后台方法中执行查询返回list列表中,执行后台产生运行时异常 java.sql.SQLException: 2.问题排查和解决:排查代码,无编译时错误,断点调试,更具控制台找到对应的 ...
- tensorflow学习4-过拟合-over-fitting
过拟合: 真实的应用中,并不是让模型尽量模拟训练数据的行为,而是希望训练数据对未知做出判断. 模型过于复杂后,模型会积极每一个噪声的部分,而不是学习数据中的通用 趋势.当一个模型的参数比训练数据还要多 ...
- 微信小程序制作家庭记账本之三
第三天,学习别人的代码,了解到wxml跟JAVAWEB中的JSP差不太多,可以形成整个页面的轮廓.wxss对每个文本框按钮进行大小颜色修饰.json的作用很是迷惑,也不清楚各种文件是怎样相互作用的.
- create-react-app @observer装饰器报错
npm install --save-dev babel-plugin-transform-decorators-legacy 然后在node_modules/babel-preset-react-a ...
- word2vec原理(一) CBOW与Skip-Gram模型基础——转载自刘建平Pinard
转载来源:http://www.cnblogs.com/pinard/p/7160330.html word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与 ...