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;
}
};

topcoder srm 661 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

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

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. Topcoder SRM 661 (Div.1) 250 MissingLCM - 数论

    [题意] 给你一个数N(1<=N<=10^6),要求最小的M(M>N),使得lcm(n+1,n+2,...m)=lcm(1,2,3,...,m) [思路] 手速太慢啦,等敲完代码的时 ...

随机推荐

  1. 如何使用Apache log4net库与ASP.NET MVC 5日志记录

    在运行软件程序的时候,跟踪和监控日志是一种记录过程的好方法. 简介: 在运行软件程序的时候,跟踪和监控日志是一种记录过程的好方法.尤其在应用程序出错的时候,日志是我们最需要的文件.不管是在web,wi ...

  2. Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

    很明显应该是HADOOP_HOME的问题.如果HADOOP_HOME为空,必然fullExeName为null\bin\winutils.exe.解决方法很简单,配置环境变量,不想重启电脑可以在程序里 ...

  3. 面向对象的多态性(C++)

    以C++为例三大特效:封装.继承.多态,面向对象的编程语言都具有这些特性. 那么本节来谈谈多态性,尽量说的简单些容易理解! 多态什么意思?即运行时多态,以相同的方式处理不同类型的对象,产生不同的结果! ...

  4. Mysql版本java问题(com.mysql.cj.jdbc.Driver和com.mysql.jdbc.Driver)

    老版本com.mysql.jdbc.Driver已弃用 String url1 = "jabc:mysql://127.0.0.1:3306/test"; String url1 ...

  5. 页面每隔n分钟轮换一个微信名和微信名

    1.前端index.html <head> <meta charset="UTF-8"> <title>n号循环</title> & ...

  6. SNMP 安装及使用

    一.SNMP的安装 1.安装 snmp服务,python扩展等 参考:http://lihuipeng.blog.51cto.com/3064864/915965 [root@localhost] y ...

  7. Web API 跨域问题

    解决办法: 1.web.config <system.webServer> <handlers> <remove name="ExtensionlessUrlH ...

  8. Sitecore CMS中配置模板部分

    如何在Sitecore CMS中配置模板部分. 注意: 本教程将扩展于“Sitecore CMS中创建模板”的章节. 配置折叠状态 配置模板部分的折叠状态允许用户选择默认折叠或展开哪些模板部分.此设置 ...

  9. .net 缓存

    缓存有很多实现方法,所有这些可以被分为两类,基于内存的缓存和基于磁盘的缓存: 1.  内存驻留缓存——包含在内存中临时存储数据的所有实现方法,通常在以下情况下使用: a)       应用程序频繁使用 ...

  10. c# ref和out参数

    向方法传递参的时候,对应的参数通常会用实参的拷贝来初始化.就是说随便在方法内部进行怎样的修改,都不会影响作为参数传递的变量的原始值. 通过上面的例子我们可以看出来,如果一个方法的参数是引用类型,那么使 ...