由于从今天开始就小小为蓝桥杯准备一下了。
在蓝桥杯官网上,水水题是必要的了。有一道题要用到,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;
}