problem1 link

$N+1$到$M$ 之间的数字要包含所有1到$N$之间出现的质因子的最高幂即可。

problem2 link

从第一个节点到第$N$个节点依次考虑。对于第$i$个节点来说,其颜色为$j$时,可以选择与前面的连边或者不连边,方案数为$1+(i-1)+g(i-1,j)$。其中$g(x,y)$ 表示前$x$个节点中,颜色为$y$ 的节点的个数

所以节点$i$的方案数为$f(i)=\sum_{j=1}^{K}(1+i-1-g(i-1,j))=K*i-\sum_{j=1}^{K}g(i-1,j)=K*i-(i-1)=$

$K+(K-1)(i-1)$

所以最后的答案为:

$ans=\prod_{i=1}^{N}f(i)$
$=\prod_{i=1}^{N}(K+(K-1)(i-1))$
$=\prod_{i=0}^{N-1}(K+(K-1)i)$
$=\prod_{j=0}^{min(M-1,N-1)}(K+(K-1)j)^{\frac{N-1-j}{M}+1}$

最后一步是由于$[1,N]$之间的数字模$M$会出现循环。

problem3 link

相连的顶点会把整个区间分成若干段。预处理四个数组:

(1) $L[i][j]$表示[i,j]是一段,这一段距离左端点最远的点的距离
(2) $R[i][j]$表示[i,j]是一段,这一段距离右端点最远的点的距离

(3) $S[i][j]$表示[i,j]是一段,这一段中距离最远的两点之间的距离

(4)$D[i][j]$表示这一段左右两个端点的距离

然后二分答案。设为$mid$.设 $dp[i][j]$表示已经把$j$对顶点连了起来,最后一对是在$i$的位置时以$i$作为路径的结尾的最小值。那么每次新连一对的时候,要保证前面不能出现大于$mid$的情况。

code for problem1

#include <algorithm>
#include <vector>
using namespace std;class MissingLCM {public:int getMin(int N) {if (N == 1) {return 2;}long long result = 0;std::vector<bool> tags(N + 1, false);for (int i = 2; i <= N; ++i) {if (!tags[i]) {for (int j = i + i; j <= N; j += i) {tags[j] = true;}long long t = 1;while (t <= N / i) {t *= i;}result = std::max(result, N % t == 0 ? N + t : N / t * t + t);}}return static_cast<int>(result);}
};

code for problem2

class ColorfulLineGraphs {public:int countWays(long long N, long long K, int M) {long long result = 1;for (int i = 0; i < M && i < N; ++i) {long long x = K + (K - 1) * i;long long y = (N - 1 - i) / M + 1;result = result * Pow(x, y, M) % M;}return static_cast<int>(result);}private:long long Pow(long long x, long long y, int M) {x %= M;long long result = 1;while (y != 0) {if (y % 2 == 1) {result = result * x % M;}x = x * x % M;y /= 2;}return result;}
};

code for problem3

#include <algorithm>
#include <cstring>
#include <vector>constexpr int kMaxN = 200;
int L[kMaxN][kMaxN];
int R[kMaxN][kMaxN];
int S[kMaxN][kMaxN];
int D[kMaxN][kMaxN];
int dp[kMaxN][kMaxN + 1];class BridgeBuilding {public:int minDiameter(const std::vector<int> &a, const std::vector<int> &b, int K) {int n = static_cast<int>(a.size()) + 1;std::vector<int> prefix_a(n);std::vector<int> prefix_b(n);for (int i = 1; i < n; ++i) {prefix_a[i] = prefix_a[i - 1] + a[i - 1];prefix_b[i] = prefix_b[i - 1] + b[i - 1];}auto Dist = [&](int a, int b, int t) {if (a >= b) {return 0;}return t == 0 ? prefix_a[b] - prefix_a[a] : prefix_b[b] - prefix_b[a];};auto GetMax = [&](int left, int right) {int number = right - left;auto Get = [&](int k) {if (k <= number) {return Dist(left, left + k, 0);}return Dist(left, right, 0) + Dist(right - (k - number), right, 1);};int total = Dist(left, right, 0) + Dist(left, right, 1);int tmax = 0;for (int L = 0, R = 0; L < number * 2; ++L) {if (R <= L) {R = L + 1;}int t = Get(L);while (R < number * 2 && Get(R) - t < total / 2) {int p = Get(R) - t;tmax = std::max(tmax, std::min(p, total - p));++R;}int p = Get(R) - t;tmax = std::max(tmax, std::min(p, total - p));}return tmax;};for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {int s0 = Dist(i, j, 0);int s1 = Dist(i, j, 1);D[i][j] = std::min(s0, s1);S[i][j] = GetMax(i, j);L[i][j] = R[i][j] = 0;for (int k = i; k <= j; ++k) {L[i][j] =std::max(L[i][j], std::min(Dist(i, k, 0), Dist(k, j, 0) + s1));L[i][j] =std::max(L[i][j], std::min(Dist(i, k, 1), Dist(k, j, 1) + s0));R[i][j] =std::max(R[i][j], std::min(Dist(k, j, 0), Dist(i, k, 0) + s1));R[i][j] =std::max(R[i][j], std::min(Dist(k, j, 1), Dist(i, k, 1) + s0));}}}auto Check = [&](int mid) {memset(dp, -1, sizeof(dp));for (int i = 0; i < n; ++i) {if (prefix_a[i] + prefix_b[i] <= mid) {dp[i][1] = std::max(prefix_a[i], prefix_b[i]);}}for (int i = 0; i < n; ++i) {for (int j = 1; j < K; ++j) {if (dp[i][j] != -1) {for (int k = i + 1; k < n; ++k) {if (S[i][k] <= mid && dp[i][j] + L[i][k] <= mid) {int v = std::max(R[i][k], dp[i][j] + D[i][k]);if (dp[k][j + 1] == -1 || dp[k][j + 1] > v) {dp[k][j + 1] = v;}}}}}}int result = std::numeric_limits<int>::max();for (int i = K - 1; i < n; ++i) {if (dp[i][K] != -1 && Dist(i, n - 1, 0) + Dist(i, n - 1, 1) <= mid) {result = std::min(result, dp[i][K] + std::max(Dist(i, n - 1, 0),Dist(i, n - 1, 1)));}}return result <= mid;};int result = std::numeric_limits<int>::max();int left = 0, right = result;while (left <= right) {int mid = (left + right) >> 1;if (Check(mid)) {result = std::min(result, mid);right = mid - 1;} else {left = mid + 1;}}return result;}
};

转载于:https://www.cnblogs.com/jianglangcaijin/p/6867299.html

topcoder srm 661 div1相关推荐

  1. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  2. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  3. topcoder srm 706 div1

    1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...

  4. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  5. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...

  6. topcoder srm 360 div1

    problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...

  7. topcoder srm 635 div1

    problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...

  8. topcoder srm 495 div1

    problem1 link 从前向后确定一下,然后再从后向前确定一下.一样的话就是可以确定的. problem2 link 首先将强连通分量缩点.理论上来说,只需要遍历所有入度为0的联通块中的一个即可 ...

  9. topcoder srm 325 div1

    problem1 link $g[i]$表示解决前$i$个的代价,那么$g[i]$是所有$g[j]+cost(j+1,i)$的最小值. import java.util.*; import java. ...

最新文章

  1. 映入眼帘的JSON-fastjson常见用法
  2. Matlab编程与数据类型 -- 函数M文件的组成
  3. html 列表bootstrap,bootstrap都有哪些类?
  4. git bash打印当前文件结构_6 个方便的 Git 脚本
  5. boost::push_back相关的测试程序
  6. jzoj3860-地壳运动(mst)【最小生成树,三分】
  7. 【Java】continue和break区别
  8. python 浏览器自动化 弹窗控制_Selenium2+Python自动化-处理浏览器弹窗(转载)
  9. 开源管理项目管理_避免开源项目管理中的不良做法
  10. 拳王虚拟项目公社:网上做什么兼职副业比较容易挣到钱?虚拟资源项目是赚钱的最佳选择
  11. Iometer存储测试工具参数说明-图形主界面(整理)
  12. Maven学习总结(34)——Maven settings.xml配置解读
  13. 2005/2/21 开始查阅有关gis的相关信息
  14. 线程 daemon java user,Java线程_守护线程和用户线程
  15. 语言模型——深度学习入门动手
  16. ElasticSearch搜索引擎:数据的写入流程
  17. 机器学习模型评估方法
  18. 三、动态构建GStreamer管道
  19. java文字手写识别_【手写文字识别】-JavaAPI示例代码
  20. 「机器学习」天池比赛:金融风控贷款违约预测

热门文章

  1. 管家婆7.2集合最新打印管理器_链接海内外企业用户丨管家婆分销ERP繁体版/英文版...
  2. kmeans及模型评估指标_聚类分析的过程和两个常用的聚类算法
  3. linux 执行iso 文件,linux可以加载iso镜像文件到启动项吗
  4. c oracle更新参数化,Dapper的参数化更新和插入?
  5. netty半包粘包 处理_老王:Netty到底是个什么鬼?有没有简单的理解方式?
  6. 矩形变弧度角_懒惰使人类进步:不想刷马桶,那就让马桶自己变干净丨种草机...
  7. ceph客户端使用_ceph存储之ceph客户端
  8. 实现 消息提醒图标_Mac 上自带的「提醒事项」千万别错过
  9. fscanf返回值被忽略怎么解决_pytest的fixture怎么用?
  10. 在linux看数据库表空间,Linux平台达梦数据库V7之表空间管理