Begin
(题目的排序方式:Unkown其实是按心情排的)
异或:(摘自百度百科)
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
异或略称为XOR、EOR、EX-OR
程序中有三种演算子:XOR、xor、⊕。
使用方法如下
z = x ⊕ y
z = x xor y
运算法则
1. a ⊕ a = 0
2. a ⊕ b = b ⊕ a
3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
5. a ⊕ b ⊕ a = b.
6.若x是二进制数0101,y是二进制数1011;
则x⊕y=1110
只有在两个比较的位不同时其结果是1,否则结果为0
2019.08.09【NOIP普及组】模拟赛C组
如需查看原题(如果luogu有原题的话,部分题只是题意相近),请点击每道题的标题!!!
这道题依然是bao li chu qi ji打表找规律,对于gcd(a,b)和a xor b(xor 表示异或)
有:
解:设a>b
a xor b 严格大于等于a-b;(为什么?可以去某百科看看异或的性质,以及减号在二进制下的情况)
而gcd(a,b)严格小于等于a-b(很容易想通的呀)
又因为gcd(a,b)=a xor b;
所以gcd(a,b)=a-b=a xor b;
程序就只用枚举gcd(a,b)和它的倍数就可以了
代码实现:
#include <cstdio>
#define rr register
int n,ans;
int main()
{
freopen("gcdxor.in","r",stdin);
freopen("gcdxor.out","w",stdout);
scanf("%d",&n);
for(int c=;c<=n;++c)
{
for(int a=c+c;a<=n;a+=c)
{
if(a-c==(a^c))
ans++;
}
}
printf("%d",ans);
}
xor
第1题 【2297. 棋盘】(暂无原题)
我的思路:
可以先模拟找规律读懂题,把题意弄明白了以后就可以想到以下情况一定成立(假设出发点坐标x,y,下面的k取值范围:全体整数)
x+k,y+k;
x+2k,y;(走法例子:1.x+k,y+k;2.x+k,y-k)
x,y+2k;
也就是说,最后处理过的结果是2的倍数,就可以走到,否则不能.
我们先控制一个变量相同,现在就只用处理另外一个了;
我们控制起始点x1与终点x2相同
具体做法:y1+=x2-x1;x1+=x2-x1;
现在再管两个y之间的距离即可
如果是偶数,输出Yes,否则输出No
代码实现:
#include <cstdio>
#define rr register
int n,x1,x2,y1,y2;
int main()
{
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
scanf("%d",&n);
for(rr int i=;i<=n;i++)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if(x1==x2 && y1==y2)
{
printf("Yes\n");
continue;
}
int a,b;
a=x2-x1;
x1+=a;
y1+=a;
b=y2-y1;
if(b%==)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
chess
第2题 【2295.栈】(未找到原题)
第3题 【2296.神殿】
End