topcoder srm 713 div1
problem1 link
如果$a^{b}=c^{d}$,那么一定存在$t,x,y$使得$a=t^{x},c=t^{y}$。一旦$t,x,y$确定,那么可以直接计算出二元组$b,d$有多少。对于$t$,若$t>\sqrt{n}$,那么$x=y=1$。若$t\leq \sqrt{n}$那么$x,y$的值不会超过30,暴力枚举即可
problem2 link
令$f[mask][v]$表示已经遍历了状态$mask$,现在在节点$v$ 时可以遍历到的节点状态。$dp[mask][v]$表示遍历了状态$mask$现在在$v$时遍历完所有节点的方案数,那么有$dp[mask][v]=\sum_{t\in v_{adj}}dp[mask|1<<t][t]*dp[f[mask|1<<t][t]][v]$
problem3 link
设$m$是$w$中的最大值。
设$f[i]$表示重量是$i$的最大价值。那么$f[i]=max(f[i-w_{t}]+v_{t})$.这里还要计算种类的个数,可以定义$\left (value,total \right )$。然后需要重新定义加法和乘法。
由于询问的重量的值很大,可以用矩阵幂来加速。这里的重点是矩阵$M$的$k$次方,只维护连续的$m+1$个重量,即$f[k-m],f[k-(m-1)],..,f[k-2],f[k-1],f[k]$。
所以对于询问$q$来说,只需要计算$M^{q}$即可。这里可以预处理出$M,M^{2},M^{4},M^{8},M^{16}$等以加速运算
$w=(2,3),v=(20,30)$时得到的转移矩阵$M$如下。其中$N$代表无效的转移
$\begin{bmatrix}N & N & N & N\\ (0,1) & N & N &(30,1) \\ N & (0,1) & N & (20,1)\\ N & N & (0,1) &N \end{bmatrix}$
假设计算的$q=6$,那么初始为$\left (f[-3],f[-2],f[-1],f[0] \right )=\left (N,N,N,(0,1) \right )$,表示重量为0的价值为0,有一种情况
$\left (f[-3],f[-2],f[-1],f[0] \right )*M=\left (f[-2],f[-1],f[0],f[1] \right )=\left (N,N,(0,1),N \right )$,表示重量为0的价值为0,有一种情况
$\left (f[-2],f[-1],f[0],f[1] \right )*M=\left (f[-1],f[0],f[1],f[2] \right )=\left (N,(0,1),N,(20,1) \right )$,表示重量为0的价值为0,有一种情况,重量为2的最大价值为20,有一种情况
继续下去可以得到:
$\left (f[-1],f[0],f[1],f[2] \right )*M=\left (f[0],f[1],f[2],f[3] \right )=\left ((0,1),N,(20,1) ,(30,1)\right )$
$\left (f[0],f[1],f[2],f[3] \right )*M=\left (f[1],f[2],f[3],f[4] \right )=\left ((0,1),(20,1) ,(30,1),(40,1)\right )$
$\left (f[1],f[2],f[3],f[4] \right )*M=\left (f[2],f[3],f[4],f[5] \right )=\left ((20,1) ,(30,1),(40,1),(50,2)\right )$
$\left (f[2],f[3],f[4],f[5] \right )*M=\left (f[3],f[4],f[5],f[6] \right )=\left ((30,1),(40,1),(50,2),(60,2)\right )$ 所以重量为6的最大价值为60,有2种情况
code for problem1
#include <cmath>
#include <set> class PowerEquation {
static constexpr int kMod = 1000000007; int Gcd(int x, int y) { return y == 0 ? x : Gcd(y, x % y); } int Get(int x, int y, int n) {
int t = Gcd(x, y);
x /= t;
y /= t;
if (x == y) {
return n;
}
return n / std::max(x, y);
} public:
int count(int n) {
long long result = 1ll * n * n % kMod; int sq = static_cast<int>(std::sqrt(n) + 1); std::set<std::pair<int, int>> S;
for (int t = 2; t * t <= n; ++t) {
long long a = 1;
for (int x = 1; a * t <= n; ++x) {
a *= t;
long long b = 1;
for (int y = 1; b * t <= n; ++y) {
b *= t;
if (S.count({a, b}) > 0) {
continue;
}
S.insert({a, b});
if (a == b && a >= sq) {
result -= n;
}
result += Get(x, y, n);
result %= kMod;
}
}
}
result += 1ll * (n - sq + 1) * n % kMod;
return static_cast<int>(result % kMod);
}
};
code for problem2
#include <string>
#include <vector> class DFSCount {
public:
long long count(const std::vector<std::string> &G) {
int n = static_cast<int>(G.size());
g.resize(n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (G[i][j] == 'Y') {
g[i].push_back(j);
}
}
} f.resize(1 << n);
for (int i = 0; i < (1 << n); ++i) {
f[i].resize(n);
}
for (int i = 0; i < (1 << n); ++i) {
for (int j = 0; j < n; ++j) {
if (0 != (i & (1 << j))) {
f[i][j] = Dfs(i, j);
}
}
}
dp.resize(1 << n);
for (int i = 0; i < (1 << n); ++i) {
dp[i].resize(n, -1);
}
long long ans = 0;
for (int i = 0; i < n; ++i) {
ans += DFS(1 << i, i);
}
return ans;
} private:
int Dfs(int mask, int v) {
if (f[mask][v] != 0) {
return f[mask][v];
}
f[mask][v] = mask;
for (int t : g[v]) {
if (0 == (mask & (1 << t))) {
f[mask][v] |= Dfs(mask | (1 << t), t);
}
}
return f[mask][v];
} long long DFS(int mask, int v) {
if (f[mask][v] == mask) {
return 1;
}
if (dp[mask][v] != -1) {
return dp[mask][v];
}
dp[mask][v] = 0;
for (int t : g[v]) {
if (0 == (mask & (1 << t))) {
int new_mask = mask | (1 << t);
long long x = DFS(new_mask, t);
long long y = DFS(f[new_mask][t], v);
dp[mask][v] += x * y;
}
}
return dp[mask][v];
} std::vector<std::vector<int>> g;
std::vector<std::vector<int>> f;
std::vector<std::vector<long long>> dp;
};
code for problem3
#include <algorithm>
#include <vector> class CoinsQuery {
static constexpr int kMod = 1000000007;
struct Node {
long long value = 0;
long long total = 0; Node() = default;
Node(long long value, long long total) : value(value), total(total) {} bool Valid() const { return value != -1; } Node operator+(const Node &other) const {
if (!Valid()) {
return other;
}
if (!other.Valid()) {
return *this;
}
Node r;
r.value = std::max(value, other.value);
if (value == other.value) {
r.total = (total + other.total) % kMod;
} else if (value > other.value) {
r.total = total;
} else {
r.total = other.total;
}
return r;
} Node operator*(const Node &other) const {
if (!Valid() || !other.Valid()) {
return Node(-1, 0);
}
Node r;
r.value = value + other.value;
r.total = total * other.total % kMod;
return r;
}
}; struct Matrix {
int n = 0;
int m = 0;
std::vector<std::vector<Node>> mat;
Matrix(int n = 0, int m = 0) : n(n), m(m) {
mat.resize(n);
for (int i = 0; i < n; ++i) {
mat[i].resize(m);
for (int j = 0; j < m; ++j) {
mat[i][j].value = -1;
mat[i][j].total = 0;
}
}
} Matrix operator*(const Matrix &other) const {
int n = this->n;
int m = this->m;
int r = other.m;
Matrix result(n, r);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < r; ++j) {
for (int k = 0; k < m; ++k) {
result.mat[i][j] = result.mat[i][j] + mat[i][k] * other.mat[k][j];
}
}
}
return result;
}
}; public:
std::vector<long long> query(const std::vector<int> &w,
const std::vector<int> &v,
const std::vector<int> &query) {
int n = static_cast<int>(w.size());
constexpr int kMax = 30;
std::vector<Matrix> all(kMax);
int m = *std::max_element(w.begin(), w.end());
all[0] = Matrix(m + 1, m + 1);
for (int i = 0; i < n; ++i) {
all[0].mat[m - w[i] + 1][m] = all[0].mat[m - w[i] + 1][m] + Node(v[i], 1);
} for (int i = 0; i < m; ++i) {
all[0].mat[i + 1][i] = all[0].mat[i + 1][i] + Node(0, 1);
} for (int i = 1; i < kMax; ++i) {
all[i] = all[i - 1] * all[i - 1];
}
std::vector<long long> result;
for (int q : query) {
Matrix i(1, m + 1);
i.mat[0][m] = Node(0, 1);
for (int j = 0; j < kMax; ++j) {
if ((q & (1 << j)) != 0) {
i = i * all[j];
}
}
if (!i.mat[0][m].Valid()) {
result.push_back(-1);
result.push_back(-1);
} else {
result.push_back(i.mat[0][m].value);
result.push_back(i.mat[0][m].total);
}
}
return result;
}
};
参考:
https://blog.csdn.net/samjia2000/article/details/73549791
topcoder srm 713 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)其 ...
随机推荐
- LA 4992 Jungle Outpost(半平面交)
Jungle Outpost [题目链接]Jungle Outpost [题目类型]半平面交 &题解: 蓝书282 我自己写的代码居然AC了!!! 刘汝佳的说要right要-3什么的,还要特判 ...
- c3p0:Connections could not be acquired from the underlying database!解决方案
在利用ssh框架做网站的时候遇到了一个比较棘手的问题,一直连接不上数据库,问题描述如下: 各种百度然后说的最多的解决方案是: 1,驱动配置有误:2,数据库连接地址有误:3,密码或帐号有误: 4,数据库 ...
- Bukkit插件编程中.yml配置文件的创建和读取
package com.sklm.config; import java.io.BufferedOutputStream; import java.io.BufferedReader; import ...
- Jenkins实现自动化部署
首先登录到服务器,目前我所使用的program-DEV环境所在服务器为:IP 登录密码为:密码 1.基础配置 检查所有环境变量: $ env 2.下载安装包安装 JDK:由于本机器已经安装,这 ...
- C# 调用.bat 提示该命令不是内部命令或外部命令
前提:双击.bat文件可以执行成功,用C#调用提示该命令不是内部命令或外部命令...... 解决方法:下面代码的红色标注,既要设置.bat文件的文件名FileName,也要设置.bat文件所在的文件夹 ...
- web基础,用html元素制作web页面
用div,form制作登录页面,尽可能做得漂亮. 练习使用下拉列表选择框,无序列表,有序列表,定义列表. 观察常用网页的HTML元素,在实际的应用场景中,用已学的标签模仿制作. <!DOCTYP ...
- vim 命令学习(基础篇)
[1]三种模式 vi的三种模式:命令模式.末行模式.编辑模式. 三种模式相互切换逻辑与命令图: 1.命令模式是vi的默认模式(即每打开一个文件时的初始模式). 2.命令模式切换至末行模式,末行模式切换 ...
- localstorage跨域解决方案
localstorage也存在 跨域的问题, [解决思路如下] 在A域和B域下引入C域,所有的读写都由C域来完成,本地数据存在C域下; 因此 A哉和B域的页面必定要引入C域的页面; 当然C域最好是主域 ...
- ESXi 嵌套KVM虚拟化 配置
VMware ESXi5.x默认不支持嵌套虚拟化,需要修改相关配置才能支持 1.ESXi5.1主机开通ssh,修改VMware ESXi配置文件使之嵌套虚拟化. 在配置文件后面加入如下配置:vhv ...
- [转载]表单校验之datatype
凡要验证格式的元素均需绑定datatype属性,datatype可选值内置有10类,用来指定不同的验证格式. 如果还不能满足您的验证需求,可以传入自定义datatype,自定义datatype是一个非 ...