小总结:快速幂+贪心————Bit Mask____UVA 10718 多多去理解去温习哦!

传送门:https://vjudge.net/problem/UVA-10718

Preview:

bitstream:a flow of data in binary form.

in bit-wise expression:用位表示。

Her face was a cold blank mask.  她装出一副冰冷冷毫无表情的样子。

perform a bit-wise AND operation.

In bit-wise expression, mask is a common term.

输入3个数 n,l,u,问你能否找出一个数m,在满足 l <= m <= u的情况下。使得m|n最大,如果有多个数都能使得m|n最大,那么输出最小的那个数。

分析:

这题用贪心来写。。我们知道或操作。只要有1进行或操作后会变成1。。

所以在进行贪心的时候。我们只要考虑n为1的位置尽量用0去填,n为0的位置尽量用1去填。

不过在这之前要进行一个判断。就是如果当前一位如果填上1,会超过上界r,则只能填0.如果当前一位填上了0,会使得即使后面每位都填上1也到不了下界l,则只能填1.

然后由于n最大为2^32。。本来想用位运算的结果悲剧了。。最后自己写了个快速幂去把一个数拆解成01的二进制数。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n,l,r;
int vis[33];
ll num;

ll mi(ll a,ll b)	//快速幂
{
	ll ans=1;
	while(b)
	{
		if(b&1)	ans=(ans*a);
		b>>=1;
		a=(a*a);
	}
	return ans;
} 

int main()
{
    while(~scanf("%lld%lld%lld",&n,&l,&r))
	{

		for(int i=31;i>=0;i--)
		{
	    	if(n>=mi(2,i))
			{
				n-=mi(2,i);
				vis[i]=1;
	    	}
	    	else vis[i]=0;
		}

		num=0;
		for(int i=31;i>=0;i--)
		{

	    	if(mi(2,i)+num>r) continue;		//如果填1超过上界
	    	else if(mi(2,i)-1+num<l)		//如果填0到不了下界
				num+=mi(2,i);
	    	else
			{
				if(!vis[i])					//0的位置填1
		    	num+=mi(2,i);
	    	}

		}
	printf("%lld\n",num);
    }
    return 0;
}

  

Resorce:

https://blog.csdn.net/accelerator_/article/details/10031579

原文地址:https://www.cnblogs.com/dragondragon/p/11385854.html

时间: 2024-11-14 12:31:24

小总结:快速幂+贪心————Bit Mask____UVA 10718 多多去理解去温习哦!的相关文章

hdu 4704 Sum (费马小定理+快速幂)

//(2^n-1)%mod //费马小定理:a^n ≡ a^(n%(m-1)) * a^(m-1)≡ a^(n%(m-1)) (mod m) # include <stdio.h> # include <algorithm> # include <string.h> # define mod 1000000007 using namespace std; __int64 pow(__int64 n) { __int64 p=1,q=2; while(n) { if(n%

2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)

题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少时最少的个数,rb代表1最多时的个数.一张牌翻两次和两张牌翻一次 得到的奇偶性相同,所以结果中lb和最多的rb的奇偶性相同.如果找到了lb和rb,那么,介于这两个数之间且与这两个数奇偶性相同的数均可取到,然后在这个区间内求组合数相加(若lb=3,rb=7,则3,5,7这些情况都能取到,也就是说最后的

hdu_4869_ 费马小引理+快速幂

Turn the pokers 题意: 给定m张牌,初始状态均为反面朝上.给定n次操作,每次指定所要翻的牌数,求n次操作后的牌的状态总数 mod 1000000009. 输入: 第一行n和m,代表n次操作和m张牌: 第二行n个数,代表每次要翻的牌的张数. 输出: 方案数 mod 1000000009. 思路: 设反面为0,正面为1.对于一张牌翻两次和两张牌翻一次 得到的奇偶性相同,所以结果中最少的1(S)和最多的1(E)的奇偶性相同.如果找到了S和E,那么,介于这两个数之间且与这两个数奇偶性相同

hdu 4704 费马小定理+快速幂

题意就是:做整数拆分,答案是2^(n-1) 由费马小定理可得:2^n % p = 2^[ n % (p-1) ]  % p 当n为超大数时,对其每个数位的数分开来加权计算 当n为整型类型时,用快速幂的方法求解 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const in

HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/details/52577212 [分析]一开始想简单了,对于a^x mod p这种形式的直接用欧拉定理的数论定理降幂了 结果可想而知,肯定错,因为题目并没有保证gcd(x,s+1)=1,而欧拉定理的数论定理是明确规定的 所以得另谋出路 那么网上提供了一种指数循环节降幂的方法 具体证明可以自行从网上找一找 有

BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的染色方案视为等价的,求等价类计数. 分析 给出置换求等价类计数,用Burnside引理:等价类计数=(每一个置换不动点的和)/置换数.(不知道的建议去看白书) 其中不动点是指一个染色方案经过置换以后染色与之前完全相同. 1.求不动点个数. 不动点的话同一个循环内的每一个点的颜色必须相同(否则不同颜色

HDU 4704 Sum(隔板原理+组合数求和公式+费马小定理+快速幂)

题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=4704 Problem Description Sample Input 2 Sample Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases. 题意是输入一个N,求N被分成1个数的结果+被分成2个数的结果+...+被分成N个数的结果,N很大 1.隔板原理 1~N有

hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)

题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Holion August will eat every thing he has found. Now there are many foods,but he does not want to eat all of them at once,so he fi

HDU4869:Turn the pokers(费马小定理+快速幂)

Problem Description During summer vacation,Alice stay at home for a long time, with nothing to do. She went out and bought m pokers, tending to play poker. But she hated the traditional gameplay. She wants to change. She puts these pokers face down,