1、给定一个数字$N$,从1到100的100个数字中选出$K$个数字(设为集合$S$),然后对$S$进行如下运算:

(1)删除$S$中的某些数字;(可以删除0个数字)

(2)将$S$中的某些数字取为它的相反数;(可以改变0个数字)

(3)对$S$中的数字求和得到$ans$

现在给出一种选择$K$个数的方法使得无论如何操作,$ans \neq N$。$1\leq N \leq 100,1\leq K \leq 15$

思路:从2开始枚举选择一个数字$x$,使得$N$%$x\neq 0$,然后选择$x,2x,3x,...,Kx$。这样的话无论如何操作最后的$ans$都是$x$ 的倍数。但是当$N=60$时$x=7$,这是如果$K=15$,最后会选择105,这是可以特殊处理,把105换成1.因为7的任何倍数加减1都不会是60.

#include <stdio.h>
#include <string>
#include <stack>
#include <vector>
#include <string.h>
#include <algorithm>
#include <assert.h>
using namespace std; class WolfCardGame
{
public:
vector<int> createAnswer(int n,int K)
{
vector<int> ans;
for(int i=2;;++i) if(n%i)
{
for(int j=1;j<=K;++j) ans.push_back(i*j);
if(i==7)
{
ans[K-1]=1;
}
break;
}
return ans;
}
};

2、对于一个有向树(树边是有方向的)$T$,定义$f(T)$表示这样的顶点对的个数:$(u,v)$,存在从$u$到$v$的路径。现在给定一棵$n$个顶点的无向树,给每条边选择一个方向,那么有$2^{n-1}$种方式,计算每种方式产生的有向树的$f$值之和。

思路:考虑树分治。对于现在的树的重心$S$,那么对答案有贡献的顶点对有两种:要么顶点对其中的一个顶点是$S$,要么是跨过$S$的两个顶点。第一种容易计算,因为设另一个顶点是$u$,那么$u$与$S$之间的边的方向是相同的,而其他的边的方向任意,所以设它们之间的边的个数是$x$,那么对答案的贡献是$g(u)=2*2^{n-1-x}=2^{n-x}$。对于第二种,当前遍历的顶点$v$与之前遍历的顶点$u$之间的边方向是相同的,其余的边方向任意。所以设之前遍历的所有的$S$的子树得到的所有的节点的$g$值之和为$K$,$v$和$S$之间边的个数是$y$,那么当前节点的贡献为$h(v)=\frac{K}{2^{y}}$.

#include <stdio.h>
#include <string>
#include <stack>
#include <vector>
#include <string.h>
#include <algorithm>
#include <assert.h>
using namespace std; const int N=100005;
const int mod=1000000007; vector<int> g[N];
int n; int a[N];
int d[N];
int fa[N];
int p[N]; int Pow(int a,int b)
{
int ans=1;
while(b)
{
if(b&1) ans=(long long)ans*a%mod;
a=(long long)a*a%mod;
b>>=1;
}
return ans;
} const int base=Pow(2,mod-2); void init()
{
p[0]=1;
for(int i=1;i<N;++i) p[i]=(p[i-1]<<1)%mod;
} int h[N]; int aNum;
int Son[N],MaxSon[N]; void DFS(int u,int pre)
{
Son[u]=1;
a[++aNum]=u;
MaxSon[u]=0;
for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
if(v!=pre&&!h[v])
{
DFS(v,u);
Son[u]+=Son[v];
if(Son[v]>MaxSon[u]) MaxSon[u]=Son[v];
}
}
} int getcenter(int u)
{
aNum=0;
DFS(u,-1);
int ans=u,Min=aNum;
for(int i=1;i<=aNum;++i)
{
int v=a[i];
int tmp=max(aNum-MaxSon[v],MaxSon[v]);
if(tmp<Min) Min=tmp,ans=v;
}
return ans;
} int ans; void addAns(int x)
{
ans=(ans+x)%mod;
} int CurrentSum; void calAns(int u,int pre,int preSum,int dep)
{
addAns(p[n-dep]);
preSum=(long long)preSum*base%mod;
addAns(preSum);
CurrentSum=(CurrentSum+p[n-dep])%mod; for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
if(!h[v]&&v!=pre)
{
calAns(v,u,preSum,dep+1);
}
}
} void dfs(int u)
{
u=getcenter(u); int preSum=0;
for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
if(!h[v])
{
CurrentSum=0;
calAns(v,u,preSum,1);
preSum=(preSum+CurrentSum)%mod;
}
}
h[u]=1;
for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
if(!h[v]) dfs(v);
}
} class TreeWalker
{
public:
int calc(int nn,int A0,int B,int C,int MOD)
{
n=nn;
init();
a[0]=A0;
for(int i=1;i<n;++i) a[i]=((long long)a[i-1]*B+C)%MOD;
for(int i=1;i<n;++i)
{
int u=a[i-1]%i;
int v=i; g[u].push_back(v);
g[v].push_back(u);
}
dfs(0);
return ans;
}
};

  

topcoder srm 690 div1 -3的更多相关文章

  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. 数学 SRM 690 Div1 WolfCardGame 300

    Problem Statement      Wolf Sothe and Cat Snuke are playing a card game. The game is played with exa ...

  7. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

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

  8. Topcoder SRM 584 DIV1 600

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

  9. TopCoder SRM 605 DIV1

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

随机推荐

  1. Css预处理器---Less(二)

    三.Less语法 (1)变量 //less代码 @nice-blue : #5B83AD; @light-blue : @nice-blue + #111; #header { color : @li ...

  2. leetCodelinked-list-cycle-ii找到链表的环

    题目 Given a linked list, return the node where the cycle begins. If there is no cycle, return null. N ...

  3. 1.sklearn库的安装

    sklearn库 sklearn是scikit-learn的简称,是一个基于Python的第三方模块.sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的 ...

  4. Java多线程-----线程池详解

    1. 线程池的实现原理 提交一个任务到线程池中,线程池的处理流程如下: 判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务.如果 ...

  5. 用django统计代码行数+注释行数

    实现统计代码行数: 1.首先在url.py中配置 from django.conf.urls import url from django.contrib import admin from app0 ...

  6. Linux下实现免密登录

    过程如下: 1.Linux下生成密钥 通过命令”ssh-keygen -t rsa“ 2.1 通过ssh-copy-id的方式 命令: ssh-copy-id -i ~/.ssh/id_rsa.put ...

  7. Linux基础命令---iptables-save

    iptables-save iptables-save指令可以将内核中当前的iptables配置导出到标准输出.通过IO重定向功能来定向输出到文件. 此命令的适用范围:RedHat.RHEL.Ubun ...

  8. Linux基础命令---修改用户密码

    passwd 更改用户密码,超级用户可以修改所有用户密码,普通用户只能修改自己的密码.这个任务是通过调用LinuxPAM和LibuserAPI来完成的.本质上,它使用LinuxPAM将自己初始化为一个 ...

  9. php Allocator Jemalloc TCMalloc那个内存分配器比较好?

    php Allocator Jemalloc TCMalloc那个内存分配器比较好? php一键安装脚本可以选择是否安装内存优化 You have 3 options for your Memory ...

  10. vue路由5:命名视图

    <div id="app"> <div> <router-link to="/">首页</router-link> ...