蓝桥杯基础知识(三)
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.找规律