UVA 11645 Bits(组合数学)】的更多相关文章

从左往右处理,左半部分记为left, 右半部分记为right,若i,i -1均为1, 贡献为ans += (left + 1) + right * (1ll << (i - 1)); 否则贡献为ans += right * (1ll << (i - 1)); import java.math.BigInteger; import java.util.Scanner; public class Main{ public static void main(String[] args){…
题目链接:11645 - Bits 题意:给定一个数字n.要求0-n的二进制形式下,连续11的个数. 思路:和 UVA 11038 这题相似,枚举中间,然后处理两边的情况. 只是本题最大的答案会超过longlong,要用高精度,只是借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字.这样能保存到2个longlong的长度,就足够存放这题的答案了. 代码: #include <stdio.h> #include…
题意:给定一个数 n,求 0 ~ n,中二进制表示中连续两个 1 出现的次数. 析:枚举连续的两个 1,从低位向高位进行枚举,然后前可以是任意数,后面也是任意的,如果 n 正好是 11 还要另算,举个例子. 10110,假设现在枚举第 2 位和第 3 位,那么出现的次次数就是前面的 10,还有第一位是任意的,所以就有 10 = 2 * 2 = 4 种,而且正好第 2 位和第 3 位是 1,那么对于第一位也是是随便的,再加上 2. 代码如下: #pragma comment(linker, "/S…
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个点,并且放在角上的点,同时算那个角所在的行和所在的列.不允许剩下点,求总共的方案数量,结果对1000007取模. 数据范围2 ≤ M,N ≤ 20,K ≤ 500. 考虑到要求组合数目,首先就需要预处理500以内的组合数.正向求解可能有些困难,这样考虑: 不管三七二十一,先求解出所有情况的总和,即C…
In a galaxy far far away there is an ancient game played among the planets. The specialty of the gameis that there is no limitation on the number of players in each team, as long as there is a captain inthe team. (The game is totally strategic, so so…
题意: 两个等长的字符串p和q,p有‘0’,‘1’,‘?’组成,q由‘0’,‘1’组成.有三种操作:1.将‘?’变成0:2.将‘?’变成‘1’:3.交换同一字符串任意两个位置上的字符.问有p变到q最少需要几次操作. 分析: 若两个位置上的字符相同,则不用处理:能交换位置便交换位置,这样能一次改变两个字符,优先交换‘0’,如果没‘0’再交换‘?’. 代码: #include <iostream>#include <cstring>#include <cstdio>#inc…
题意:有n个人,选不少于一个人参加比赛,其中一人当队长,有多少种选择方案. 思路:我们首先C(n,1)选出一人当队长,然后剩下的 n-1 人组合的总数为2^(n-1),这里用快速幂解决 代码: #include <iostream> #define ll long long using namespace std; ; ll qmod(ll a, ll b) { ll ans=; while(b) { ) { ans=(ans*a)%mod; } b=b/; a=(a*a)%mod; } re…
题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作. 析:先说我的思路,我看到这应该是贪心,首先,如果先判断s能不能变成t,就计算t中的1和s中的1. 然后算出t比s多多少1,然后先考虑把?变成1是最优的,如果不够就只能把0变成1,切不可把?变成1,因为这样要两步, 不是最优,而把0变成1是一步.然后把剩下的?变成1(如果1还不够)或者是0(1够了).最后是计算要交换的次数, 这个只要统计不同的位置有多少即可,别忘了1可…
题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作 先可以画个草图 发现需要考虑的就是 1---0 0---1 ?---0 ?---1 下面三种都是只需要一次操作就可以完成的, 所以应该优先考虑1---0 如果存在0---1,就优先交换1---0和0---1,因为这样可以同时满足两组 如果不存在0---1,就交换1---0与?---1,这样每交换一次,需要两次操作,即先将问号变成0,再交换 如果最后都还剩下有1--0(因…
题意:输入两个等长(长度不超过100)的串S和T,其中S包含字符0,1,?,但T只包含0和1,你的任务是用尽量少的步数把S变成T.有以下3种操作: 1.把S中的0变成1. 2.把S中的“?”变成0或1. 3.交换S中任意两个字符. 分析: 1.为保证步数最少,先统计两串中1的个数和1的位置.如果cnta>cntb,则不能把S变成T,因为1不能变成0. 2.先将?变成0或1,变换原则是若cnta<cntb且b中对应位置为1,则变为1:否则,变为0. 3.再将0变成1,变换原则是cnta<c…