此题坑点: 结果必须要用long long存,int存不下 如果想要像cout<<sum*pow(2,num-1)这样在输出时计算会错:long long在计算过程被隐式转换成了double,需要用强制类型转换转换回long long输出. 集合论和排列组合公式初中还没学 题目描述 给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 分析 我们来看一个例子: \{1,2,3\}{1,2,3} 可以得到,它的所有非空子集为 \{1,2,3\}{1,2,3} \{1,2\}…
P2415 集合求和显然,一共有2^n个子集,对于其中的一个确定的元素,它不在的集合有2^(n-1),相当于有n-1元素,那么它存在的集合有,2^n-2^(n-1)==2^(n-1),那么集合的和为sum*2^(n-1). #include<bits/stdc++.h> using namespace std; long long p(long long t,long long x) { ==) { t*=t; x>>=; } ; ) { ==) { result*=t; } t*…
上模板题例题: [CQOI2007]余数求和 洛谷 BZOJ 题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值. 等等……这题就学了三天C++的都会吧? $1\leq n,k\leq 10^9$.(一口老血喷到屏幕上) $O(n)$ 行不通了,考虑别的做法. 我们来看一下 $\lfloor\frac{x}{i}\rfloor$ 的值. $x=9$:(不包括0,只有4种取值?) i 1 2 3 4 5 6 7 8 9 10 x/i 9 4 3 2 1 1 1 1 1 0 $x=1…
洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\),那么对于一次形如 \(\forall i\in[l,r],a_i\leftarrow a_i+x\) 的操作三元组 \((l,r,x)\),我们有: \(l=1,r=n\),等于啥也没干,那么我们显然不会选择这样的区间进行操作,否则就会浪费一次操作次数,所以我们 duck 不必考虑这种情况. \…
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复杂度要优化成\(O(n^2)\)的,可以参考之前写的这篇博客 #include <cstdio> #include <algorithm> using std::min; using std::max; const int N = 3e3 + 10, inf = 1e9 + 7; co…
洛谷题面传送门 怎么题解区全是 2log 的做法/jk,这里提供一种 1log 并且代码更短(bushi)的做法. 首先考虑对于一个序列 \(a\) 怎样计算将其变成单调不降的最小代价.对于这类涉及区间操作问题,果断往差分序列方向想,我们记 \(d_i=a_i-a_{i+1}\),那么我们肯定会想将所有 \(d\) 都变成非正的,而一次操作肯定会将某个 \(d_i\) 减 \(1\),并选择将某个 \(d_i\) 加 \(1\)(当然也可以不操作).加一肯定是不优的,因此我们每次肯定会选择最右边…
次元传送门:洛谷P1373 思路 设f[i][j][t][1/0]表示走到(i,j)时 小a减去uim的差值为t 当前是小a取(0) uim取(1) 那么转移就很明显了 f[i][j][t][]=(f[i][j][t][]+f[i-][j][(t-map[i][j]+k)%k][])%;//因为当前是小a取 前一步是uim取 差值增加 f[i][j][t][]=(f[i][j][t][]+f[i][j-][(t-map[i][j]+k)%k][])%; f[i][j][t][]=(f[i][j]…
我没有找到能在bzojAC的代码--当然我也WA了--但是我在洛谷过了,那就假装过了吧 minmax线段树一开始写的只能用min更新min,max更新max,实际上是可以互相更新的-- 首先看第二问,注意到因为没有相交,所以可以全都按某种顺序像同一个方向移动来完成游戏,这个顺序通过扫描线找到,用set维护经过当前x坐标的的线段的y坐标,具体用y=kx+b的形式维护,因为不相交,所以随着x的变化,线段的y点的大小关系不会改变:每次插入一个点的时候,找一下它的前驱后继,分别连边(这里的前驱后继就相当…
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 3 输出样例#1: 10 说明 子集为: [] [2] [3] [2 3] 2+3+2+3=10 保证结果在10^18以内. [分析]非常容易推导出,每个元素在集合中总共出现了2^(n-1)(n指集合中元素的个数)次,以样例为例: 可以很容易的发现每个元素在集合中都各出现了2^(2-1) = 2次.如此,我们得到一个…
题目描述 给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 3 输出样例#1: 10 说明 子集为: [] [2] [3] [2 3] 2+3+2+3=10 保证结果在10^18以内. 首先,当子集里只有一个元素时,在其他剩余的元素中不能选出任何元素加入到子集中,所以对于每个元素来说,均有C_{n-1}^0Cn−10​次被选中. 当子集里有2个元素时,在其他剩余的元…