蓝桥杯基础知识(三)

1.按位与(&)

这个地方比较的是两个数字的二进制,比如a&b(a为5,b为10时,a的二进制表示为0101,b的二进制表示为1010),他们对应的位置如果都为1时,则新的位置为1,其余都为0,故a&b=0000;

2.按位或(OR)

按位或运算符(|)将两个数的二进制位逐位对齐,只要其中一个位为1,结果位就为1;如果两个位都为0,结果位才为0。

3.按位异或(XOR)

按位异或运算符(^)将两个数的二进制位逐位对齐,当两个位不同(一个为0,一个为1)时,结果位为1;否则为0。

4.按位取反/取非(NOT)

按位非运算符(~)将一个数的每个位反转:0变为1,1变为0。

5.>>和<<

>>n位,就相当于除以2的n次方。

<<n位,就相当于乘以2的n次方。

6.汉诺塔问题

#include <bits/stdc++.h>
using namespace std;  
vector<string> arr;//设置一个arr容器储存每一步
void hnt(string from,string assist,string to,int n){
  if(n==1){//如果只有一个需要移动,他可以直接从起点到终点,所以直接存入即可
    string s="#"+to_string(n)+": "+from+"->"+to;
    arr.push_back(s);
    return ;
  }
  hnt(from,to,assist,n-1);//先把最大的上面的全都放到辅助位置
  string s="#"+to_string(n)+": "+from+"->"+to;//现在可以把最大的放到终点
  arr.push_back(s);
  hnt(assist,from,to,n-1);//把辅助位置放到终点
}
int main(){

  int n,m;
  cin>>n>>m;
  hnt("A","B","C",n);
  cout<<arr[m-1]<<endl;
  cout<<arr.size();
  return 0;
}

特别注意,对于取模运算来说,加法和乘法的运算不受影响,只有除法不能分步取模

#include <iostream>
using namespace std;
typedef long long ll;
int main(){
  ll n;
  cin>>n;
  ll x=998244353;
  ll jie=1;
  ll now=0;
  for(ll i=1;i<=n;i++){
    jie*=i;
    jie%=x;
    now=(now*i%x+ i*(i-1)/2*jie%x)%x;//公式推到的来源是规律,每次插入一个新的数字n,有n个位置去插入上一个数组,上一个数组的组合有n-1的阶乘那么多,然后加上上一个数组的价值*n,因为多插入了一个数字,现在一共有n个数字,所以乘上n
	}
  cout<<now;
}

7.找规律

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务