目录标题
I xay loves or 点击查看 1813/7606 通过
输入:
2 5
输出:
0
题意:
给出x和s,求有多少个整数y满足x or y == s
思路:
x|y>=x,根据或运算运算规则:0|0=0,1|0=1,0|1=1,1|1=1
原本的1位还是1, 0位则是有机会被置为1,因为要等于s,所以原本s的0位,x必须是0,即s&x==x必须满足,s的0位,x不能是1,否则答案就是0。
然后x的1位,y可以取0或者1,剩下的位s和x要一样,y也必须与之对应,所以答案是2^(x的1位个数)。
由于y要是正整数,所以要去掉x==s,y=0的这种情况
解法1:
这一题的s的范围在1e7左右,所以可以暴力枚举
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int x,s,ans;
cin>>x>>s;
for(int i=1;i<=s;i++)//由于y是正整数,所以不从0开始枚举哦!
if((x|i)==s)ans++;//从1开始枚举,一直到s
cout<<ans<<endl;
return 0;
}
我在写这个的代码的时候(x|i)这里忘记加括号了,就wa了,要记住哦,这种运算要加括号先运算哦!
解法二:
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int x,s;
cin>>x>>s;
if((s&x)!=x)//如果所给出的x、s本身就不妈祖题意
{
puts("0");
return 0;
}
long long ans=1;
for(int t=x;t;t-=t&(-t))
//那么这里就是把他的1的个数给弄出来
ans*=2;
if(x==s)ans--;//排除x==s的情况,y=0
cout<<ans<endl;
return 0;
}
扩展
X&(-X)的含义:
当x是奇数的时候,答案一定是1
当x是偶数的时候,答案是能够整除x的最大的2的n次方幂
x&=(x-1)
就是将x的最后一位1变成0,这个跟上面的有着一样的功效,我们可以用他来统计一个数中1的个数
int count(int x){
int res=0;
while(x>0){
x&=(x-1);
res++;
}
return res;
}
lowbit()
lowbit()函数用来取一个二进制最低位的一与后边的0组成的数,他是需要自己编写的函数哦!
第一种写法
int lowbit(int x)
{
return x&(-x);
}
第二种写法
int lowbit(int x)
{
return x&(x^(x-1));
}
然后在学trie的时候也遇到了一种写法
但是他是看最后一位数是什么
x>>i&1
for(int i=30;i>=0;i--)
{
int u=x>>i&1;//一位一位的看x是什么
}
H xay loves count 点击查看 1690/4438 通过
输入
3
1 1 1
输出
27
输入
5
1 2 4 8 16
输出
15
暴力枚举,妙啊!
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[x]++;
}
LL ans=0;
for(int i=1;i<N;i++)
for(int j=1;j<N;j++)
ans+=a[i]*a[j]*a[i*j];
printf("%d\n",ans);
return 0;
}