uva 11645 - Bits(计数问题+高精度)

题目链接:uva
11645 - Bits

题目大意:给出n,问从0到n这n+1个数种,数的二进制情况下,有多少11存在。

解题思路:和uva 11038一个类型的题目,只是这道题目是对于二进制下的情况。而且高精度部分可以用两个long long数解决。

#include <cstdio>
#include <cstring>

typedef long long ll;
const int N = 100;
const ll M = 1e13;

ll bit (int k) {
    return (ll)1<<k;
}

void add (ll& p, ll& q, ll a, ll b) {
    if (a <= 0 || b <= 0)
        return;

    q += a * b;
    p += q/M;
    q %= M;
}

void solve (ll n) {

    int j = 0;
    ll left = n/2, right = 0;
    ll p = 0, q = 0;

    while (left) {

        left /= 2;
        add(p, q, left, bit(j));
        if ((n&bit(j)) && (n&bit(j+1)))
            add(p, q, 1, right+1);

        if (n&bit(j))
            right |= bit(j);
        j++;
    }

    if (p) {
        printf("%lld", p);
        printf("%013lld\n", q);
    } else {
        printf("%lld\n", q);
    }
}

int main () {
    ll n;
    int cas = 1;
    while (scanf("%lld", &n) == 1 && n >= 0) {
        printf("Case %d: ", cas++);
        solve(n);
    }
    return 0;
}

uva 11645 - Bits(计数问题+高精度)

时间: 2024-12-08 03:24:21

uva 11645 - Bits(计数问题+高精度)的相关文章

UVA 11645 - Bits(数论+计数问题)

题目链接:11645 - Bits 题意:给定一个数字n.要求0-n的二进制形式下,连续11的个数. 思路:和?UVA 11038?这题相似,枚举中间,然后处理两边的情况. 只是本题最大的答案会超过longlong,要用高精度,只是借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字.这样能保存到2个longlong的长度,就足够存放这题的答案了. 代码: #include <stdio.h> #include

UVA - 11645 Bits

Description Problem J Bits Input: Standard Input Output: Standard Output A bit is a binary digit, taking a logical value of either "1" or "0" (also referred to as "true" or "false" respectively).  And every decimal

uva 10844 - Bloques(数论+高精度)

题目链接:uva 10844 - Bloques 题目大意:给出一个n,表示有1~n这n个数,问有多少种划分子集的方法. 解题思路:递推+高精度. 1 1 2 2 3 5 5 7 10 15 15 20 27 37 52 dp[i][j]=dp[i?1][j?1]+dp[i][j?1] dp[i][0]=dp[i?1][i?1] ans[i]=dp[i][i] 需要用到高精度,并且缩进. #include <cstdio> #include <cstring> #include &

uva 278 - Chess(计数问题)

题目链接:uva 278 - Chess 题目大意:给出一个n*m的棋盘,并且给出棋子的种类,问说在这个大小的棋盘上最多能放几个给定的棋子,棋子之间不能互相攻击. 解题思路:总共有4种棋子,那么就分类讨论. 马(骑士): n或m为1的时候,肯定可以摆满,因为肯定不能互相攻击 n或者m为2时,这样放是最优的. 其他情况的或就是间隔放最优. 车:因为车的攻击方式是直线,所以每放一个车就会攻击到一列一行,所以答案就是n和m中最小的那个. 国王:国王的攻击范围是周围8个格子,所以放法就像考试隔排隔位一样

uva 12545 - Bits Equalizer(比特变化器)

好在原来做题的思路不知道何时就养成了这种思路,可能是见这种思路多了一点吧,就自然的想到了用这种方法. 没有什么原因,思路题么,有思路那还用多说些什么,而思路是怎么来的,就更没什么好说的了...多去体会大神的思路或许是我等菜鸟提高的一个途径吧 #include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std; string s1,s2; int

uva 11645

Problem JBits Input: Standard Input Output: Standard Output A bit is a binary digit, taking a logical value of either "1" or "0" (also referred to as "true" or "false" respectively).  And every decimal number has a

UVA 12545 Bits Equalizer

#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1<<29; char s[maxn],t[maxn]; int len; int c10,c01,c1,c0;

uva 465 Overflow 还是高精度。。。

通过这道题,我学会了一个函数atof:把字符串转换为double类型,头文件:stdlib.h 还知道了double类型可以表示的范围:-1.79E+308 ~ +1.79E+308,float类型表示的范围:-3.40E+38 ~ +3.40E+38,原因是因为他们的存储方式不一样,而且是扩大了表示范围从而牺牲了精度,这种知识点我就不深究 了,这道题需要注意前导0的问题,然后比较一下就可以了,每天学点新知识挺爽的,我目前目标一天一道白书的题 目,没空做了第二天补过来 代码: #include<

UVa 12545 Bits Equalizer【贪心】

题意:给出两个等长的字符串,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(因