<bitset>类和一道水题

由于从今天开始就小小为蓝桥杯准备一下了。

在蓝桥杯官网上,水水题是必要的了。有一道题要用到,bitset,就小小学习了一下。

有些程序需要处理二进制位的有序集,每个位可能包含0值或者1值。位是用来存一组项或条件的yes/no信息的简洁方法。

标准库提供了bitset类简化了位集的处理。需要注意的是bitset类型对象的区别仅仅在于其长度而不是在其类型。

头文件:#include <bitset>

              using std::bitset;

定义:bitset<x> name;就是定义一个x位名为 name 的bitset类型。x为常量表达式。name每位都是0。

初始化:bitset<x> b;  b有x位,每位都是0。

              bitset<x> b(u);  b是unsigned long型的一个副本。

              bitset<x> b(s);   b是string对象s中含有位串的副本。

              bitset<x> b(s,pos,n);  b是s中从位置pos开始的n个位的副本。

1.用unsigned值来初始化bitset对象:

简单一句话就是,多为补0,少为丢弃。

2.用string对象初始化bitset对象。(string对象直接表示为位模式)

需要注意的是:string对象和bitset对象之间是反向转化的。string对象的最右边的字符(即下标最大的那个字符)用来初始化bitset对象 的低阶位。

string str("111111000101010101");
bitset<6> bit(str,5,5);//从下标为5开始的5位.
bitset<6> bit2(str,str.size()-4);//最后4位
主要的bitset操作:(biset<x> b)

b.any();     //b长是否存在1的位?
b.none();    //b中不存在为1位的二进制位吗?
b.count();   //b中为1的二进制位的个数.
b.size();    //b中二进制的位数
b[pos];      //访问b中在pos处的二进制位.
b.test(pos); //b在pos出的二进制位是否为1.
b.set();     //把b中所有二进制位都置为1.
b.set(pos);  //把b中pos位置为1.
b.reset();   //把b中所有二进制位都置为0.
b.reset(pos);//把b中的pos位置为0.
b.flip();    //把b中的所有二进制取反
b.flip(pos); //把b中的pos位取反
b.to_ulong();//用b中的同样的二进制位返回一个unsign long值.

一道氺题:

蓝桥杯的题目,nyoj上也有对应的题目。(蓝桥杯的数据有错,公认的有错)。

点击打开链接可以来nyoj 上测一下对错。

题目很简单:求1~n内任意三个数的,最大的最小公倍数。

在想这道题目的时候,用到了很多,以前没有意识到的结论。(虽然很明显)

1.相邻的两个数一定互素。

2.相邻的两个奇数一定互素。

3.相邻的三个数(奇数,偶数,奇数),一定互素。

思路:

想这道题目的时候,就随便的想了两个,发现,任何是相邻的数,都是互素的。

根据上面的结论1,2.

如果n是一个奇数的话,ans=n*(n-1)*(n-2)。

如果n是一个偶数的话,n和n-2肯定不是互素的,但是,n和n-1定的互素的。如果n-3和n互素的话,那不是就是很n*(n-1)*(n-3)。但是,如果不是互素的话,肯定就是(n-1)*(n-2)*(n-3),为什么?

直接代码:

 
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

long long Gcd(long long a,long long b){
    if(b==0) return a;
    return Gcd(b,a%b);
}

int main(){
    long long n;
    while(~scanf("%lld",&n)){
        if(n<=2){
            printf("%lld\n",n);
            continue;
        }
        if(n%2){
            printf("%lld\n",n*(n-1)*(n-2));
        }
        else {
            long long ans1=(n-1)*(n-2)*(n-3);
            long long ans2=n*(n-1)*(n-3);//两个相邻的奇数一定互素的.
            printf("%lld\n",Gcd(n,n-3)==1?ans2:ans1);
        }
    }
    return 0;
}        




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值