topcoder srm 690 div1 -3
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的更多相关文章
- 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如果增加 ...
- 数学 SRM 690 Div1 WolfCardGame 300
Problem Statement Wolf Sothe and Cat Snuke are playing a card game. The game is played with exa ...
- 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 ...
随机推荐
- 20180309 - C# demo - 1
using System; namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { ...
- Python全栈-day8-day9-函数1
函数 day8 1.为什么需要函数 1)代码的组织结构不清晰,可读性差 2)需要重复使用某个功能时,需要重新编写成程序,重复率高 3)多处引用相同代码时,需要扩展功能的时候过于麻烦,工作量大 2.函数 ...
- 连接远程数据库时出现 SSH: expected key exchange group packet from server / 2003 - Can't connect to MySQL server on 'XXX' (10038) / 1130 - Host 'XXX' is not allowed to connect to this MySQL server
昨天在自己的远程服务器上玩,把系统重装了.新装了MySQL,在本地用navicat连接的时候出了几个小问题. 问题一:SSH: expected key exchange group packet f ...
- ★★★kalinux 常用命令
1.修改密码: sudo passwd root 2.重启:reboot ====================================== arch 显示机器的处理器架构(1) una ...
- HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor
看到的最长的类名: HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhere ...
- 设计模式之State(状态)(转)
State的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 何时使用? State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif ...
- JDBC (29)
1.JDBC:就是一套API,由sun公司定义类或者定义的接口.(全称 java database connectivity:是Java访问数据库的标准规范),Java提供访问数据库规范称为JDBC, ...
- flask 操作数据库(分类)
数据库 数据库是大多数动态web程序的基础设施,只要你想把数据存下来,就离不开数据库. 这里所说的数据库指的是有存储数据的单个或多个文件组成的集合,它是一种容器,可以类比文文件柜.而人们通常使用数据库 ...
- c# 定义委托和使用委托(事件的使用)
使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联.随后调用委托时,就会调用所有与委托实例关联的方法. 与委托关联可以是任何类或者结 ...
- 20165215 2017-2018-2 《Java程序设计》第九周学习总结
20165215 2017-2018-2 <Java程序设计>第九周学习总结 教材学习内容总结 URL类 URL 类是 java.net 包中的一个重要的类,使用 URL 创建对象的应用程 ...