1、对于一棵树上的一个节点$u$,定义$f(u)$表示树上距离$u$最远的节点到$u$的距离。给出每个节点的$f$值,构造出这棵树。

思路:找到树的主干,然后不在主干上的节点一定可以连接到主干的某个节点上。

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
#include <fstream>
#include <sstream>
using namespace std; const int N=1000005;
const int mod=1000000007; class TreeDistanceConstruction
{
int a[111]; int get(int t,vector<pair<int,int>> &p)
{
for(int i=0;i<(int)p.size();++i)
{
if(p[i].first==t)
{
if(!a[p[i].second])
{
a[p[i].second]=1;
return p[i].second;
}
}
}
return -1;
} public:
vector<int> construct(vector<int> d)
{
const int n=(int)d.size();
vector<pair<int,int>> p;
for(int i=0;i<n;++i)
{
p.push_back(make_pair(d[i],i));
}
sort(p.begin(),p.end());
vector<int> ans;
const int Max=p.back().first;
const int Min=p[0].first; if(Min<(Max+1)/2) return ans;
if(Min>(Max+1)/2) return ans; memset(a,0,sizeof(a)); if(Max&1)
{
const int K=(Max+1)>>1;
vector<int> ll,rr;
for(int i=K;i<=Max;++i)
{
int t=get(i,p);
if(t==-1) return ans;
ll.push_back(t);
t=get(i,p);
if(t==-1) return ans;
rr.push_back(t);
}
if(get(K,p)!=-1) return ans; for(int i=0;i+1<(int)ll.size();++i)
{
ans.push_back(ll[i]);
ans.push_back(ll[i+1]);
}
for(int i=0;i+1<(int)rr.size();++i)
{
ans.push_back(rr[i]);
ans.push_back(rr[i+1]);
}
ans.push_back(ll[0]);
ans.push_back(rr[0]); for(int i=0;i<(int)p.size();++i)
{
int id=p[i].second;
if(!a[id])
{
int len=p[i].first;
int nIndex=len-K-1;
ans.push_back(id);
ans.push_back(ll[nIndex]);
}
}
return ans;
}
else
{
const int K=Max>>1;
const int Kid=get(K,p); if(Kid==-1) return ans; if(get(K,p)!=-1) return ans; vector<int> ll,rr;
for(int i=K+1;i<=Max;++i)
{
int t=get(i,p);
if(t==-1) return ans;
ll.push_back(t);
t=get(i,p);
if(t==-1) return ans;
rr.push_back(t);
} for(int i=0;i+1<(int)ll.size();++i)
{
ans.push_back(ll[i]);
ans.push_back(ll[i+1]);
}
for(int i=0;i+1<(int)rr.size();++i)
{
ans.push_back(rr[i]);
ans.push_back(rr[i+1]);
}
ans.push_back(ll[0]);
ans.push_back(Kid);
ans.push_back(rr[0]);
ans.push_back(Kid); ll.insert(ll.begin(),Kid); for(int i=0;i<(int)p.size();++i)
{
int id=p[i].second;
if(!a[id])
{
int len=p[i].first;
int nIndex=len-K-1;
ans.push_back(id);
ans.push_back(ll[nIndex]);
}
}
return ans;
} }
};

 

2、给定整数$n,K,v$,确定一个长度为$n$的序列$x$,满足$0\leq x_{i}< K$且$x_{1}x_{2}...x_{n}mod K=v$。问这样的序列有多少个。现在给出很多$v$,对每一个$v$计算一个答案。

思路:(1)首先,假设$x$的前$n-1$个数已经确定,令$r=Gcd(\prod_{i=1}^{n-1}x_{i},K)$。那么由$r,v$可以确定$x_{n}$的取值。由于$\left (r\cdot x_{n}  \right )mod K=v$,那么$r\cdot x_{n}=tK+v$,所以$Gcd(r,K)$可以整除$v$。由于$r$可以整除$K$,所以$r=Gcd(r,K)$一定可以整除$v$。那么对于某个$r$,$x_{n}$有$K/r$种选择,分别是$\frac{tK+v}{r},0\leq t<r$。

(2)由于$K$的约数不会太多,所以可以进行动态规划,设$f[i][j]$表示已经确定了$i$个$x$,它们的乘积与$K$的最大公约数为$j$。那么每次可以由$f[i][j]$转移到$f[i+1][k]$,其中$j$可以整除$k$。令$p=\frac{k}{j}$,那么$q=Gcd(j\cdot tp,K)$一定是$k$的倍数。那么进行容斥原理即可确定$x_{i+1}$ 种类使得$j\cdot x_{i+1} mod K=k$。

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
using namespace std; const int mod=1000000007; int f[55][111111];
int d[111111];
vector<int> q[111111]; void add(int &x,int y)
{
x+=y;
if(x>=mod) x-=mod;
} class ModEquation
{
public:
vector<int> count(int n,int K,vector<int> query)
{
vector<int> p; for(int i=1;i*i<=K;++i) {
if(K%i==0) {
p.push_back(i);
if(i*i!=K) p.push_back(K/i);
}
}
sort(p.begin(),p.end()); for(int i=0;i<(int)p.size();++i) {
q[i].clear();
for(int j=i;j<(int)p.size();++j) {
if(p[j]%p[i]==0) {
q[i].push_back(j);
}
}
}
f[0][0]=1;
for(int i=1;i<=n-1;++i)
{
for(int j=0;j<(int)p.size();++j)
{
for(int k=0;k<(int)q[j].size();++k) {
d[q[j][k]]=(long long)f[i-1][j]*(K/(p[q[j][k]]/p[j]))%mod;
}
for(int k=(int)q[j].size()-1;k>=0;--k) {
const int u=q[j][k];
for(int t=1;t<(int)q[u].size();++t) {
const int v=q[u][t];
add(d[u],mod-d[v]);
}
}
for(int k=0;k<(int)q[j].size();++k) {
const int u=q[j][k];
add(f[i][u],d[u]);
d[u]=0;
}
}
}
vector<int> ans;
for(int i=0;i<(int)query.size();++i) {
const int v=query[i];
int tmp=0;
for(int j=0;j<(int)p.size();++j) {
if(v%p[j]==0) {
add(tmp,(long long)f[n-1][j]*p[j]%mod);
}
}
ans.push_back(tmp);
}
return ans;
}
};

3、构造一个有$n$个顶点的有向图,使得以0号节点开始,$n-1$号节点结束的哈密顿路径恰有$k$条。$2\leq n \leq 20$。

思路:如代码所示。路径上第二个节点是$n-2$时,有1条;否则若第二个节点是$n-3-i$,则有$2^{i}$条。

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
using namespace std; class HamiltonianConstruction
{
public:
vector<string> construct(int k)
{
const int n=20;
vector<string> ans(n,string(n,'N'));
for(int i=2;i<=n-2;++i) ans[i][i-1]='Y';
for(int i=1;i<n;++i) {
for(int j=i+1;j<n;++j) ans[i][j]='Y';
}
for(int i=n-3;i>=1;--i,k>>=1) {
if(k&1) ans[0][i]='Y';
}
return ans;
}
};

  

topcoder srm 704 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 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. vue中使用elementui里的table时不被选中设置

    情景:例如提现列表,转账失败后转账金额直接返回用户余额,所以当前数据不可以再次操作 直接粘贴代码: <el-table-column type="selection" wid ...

  2. 关于调用数据库函数executeUpdate抛出异常

    2018.06.11写一个web程序的时候发现了一个问题,解决了好几天都没解决,并且也找不到问题所在.偶然百度找到了根源所在,希望可以帮到大家. 1 在调用这个函数的时候一直抛异常.刚开始我还以为是代 ...

  3. javascript 面向对象之路.2 - 小蜜蜂

    接着上篇文章继续. 要实现上篇中gif图片的效果, 我们要写js, 算法并不是很复杂, 本次也仅仅展示了实现功能的代码, 并没有从面向对象的角度去构思或重构代码. 这里, 我们定义了一些变量, 用来定 ...

  4. SVN windows内修改日志内容(错误解决)

    在我的电脑是windows 7,使用TortoiseSVN客户端,选中代码目录,点击右键,选择<显示日志> 显示日志信息 修改原来的日志信息(在需要修改的版本的日志中点击鼠标右键,显示如下 ...

  5. html中通过js获取接口JSON格式数据解析以及跨域问题

    前言:本人自学前端开发,一直想研究下js获取接口数据在html的实现,顺利地找到了获取数据的方法,但是有部分接口在调用中出现无法展示数据.经查,发现时跨域的问题,花费了一通时间,随笔记录下过程,以方便 ...

  6. IIS7配置rewriter

    遇到的问题就是rewriter不起效果冲IIS6迁移过来的.最后发现是Framework 4.0的原因!记录处理方式为: 一. <configSections> <section n ...

  7. How to compute f1 score for each epoch in Keras

    https://medium.com/@thongonary/how-to-compute-f1-score-for-each-epoch-in-keras-a1acd17715a2 https:// ...

  8. jQuery事件--keypress([[data],fn])和trigger(type,[data])

    keypress([[data],fn]) 概述 当键盘或按钮被按下时,发生 keypress 事件 keypress 事件与 keydown 事件类似.当按钮被按下时,会发生该事件.它发生在当前获得 ...

  9. C++11 Function 使用场景

    [1]场景分析 在一个函数内部,可能会多次用到某一段代码,一般情况是把这段用到次数较多的代码封装成一个函数. 但是,如果这段代码仅仅只在这个函数中有使用,这时封装成函数显得既麻烦又冗赘. 那么,有没有 ...

  10. linux常用命令:rmdir 命令

    今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删 ...