题解:CF2039C2 Shohag Loves XOR (Hard Version)

给定 x,mx,mx,m,求有多少 yyy 满足 y∈[1,m]y \in [1,m]y[1,m] 使得 x⊕yx \oplus yxy 可以被 xxxyyy 整除。

p=x⊕yp = x \oplus yp=xy,分三种情况讨论:

  1. x∣px | pxp。设 p=kxp = kxp=kx,则 y=x⊕p≤p+x≤my = x \oplus p \le p + x \le my=xpp+xm,也就是 kx≤m−xkx \le m - xkxmx,进一步化简可知 k≤⌊m−xx⌋k \le \lfloor \frac{m - x}{x} \rfloorkxmx。由于我们还有 (m−x,m](m - x,m](mx,m] 区间未检测,但可以充分利用 x⊕y≤x+yx \oplus y \le x + yxyx+y 这个性质,我们循环判断 (m−x,m+x](m - x,m + x](mx,m+x] 区间即可(当然,官方解答的做法更加简洁,但是没看懂)。

  2. y∣py | pyp。当 0<x<y0 < x < y0<x<y 时,p≤x+y<y+y=2yp \le x + y < y + y = 2ypx+y<y+y=2y,因此 p=ky(k≥2)p = ky(k \ge 2)p=ky(k2) 不存在解。因此只需要考虑 y≤xy \le xyx 的情况。

  3. x∣px | pxpy∣py | pyp。当 x≠yx \neq yx=y 时,lcm(x,y)≥2max⁡(x,y)\rm{lcm(x,y)} \ge 2 \max (x,y)lcm(x,y)2max(x,y),然而 p<2max⁡(x,y)p < 2 \max (x,y)p<2max(x,y),因此只有 x=yx = yx=y 时才能成立。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define init(x) memset (x,0,sizeof (x))
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
using namespace std;
const int MAX = 1e5 + 5;
const int MOD = 1e9 + 7;
inline ll read ();
ll t;
int main ()
{
	//freopen (".in","r",stdin);
	//freopen (".out","w",stdout);
	t = read ();
	while (t--)
	{
		ll x = read (),n = read (),cnt = (n - x) / x + (n < 2 * x && x <= n);
		for (ll i = (n - x) / x * x + 1;i <= n + x;++i) //枚举 x ^ y 
			if (1 <= (i ^ x) && (i ^ x) <= n && i % x == 0) ++cnt;
		for (ll i = 1;i <= min (n,x);++i) // 枚举 y 
			if ((x ^ i) % i == 0) ++cnt;
		printf ("%lld\n",cnt - (n >= x));
	}
	return 0;
}
inline ll read ()
{
    ll s = 0;int f = 1;
    char ch = getchar ();
    while ((ch < '0' || ch > '9') && ch != EOF)
	{
        if (ch == '-') f = -1;
        ch = getchar ();
    }
    while (ch >= '0' && ch <= '9')
	{
        s = s * 10 + ch - '0';
        ch = getchar ();
    }
    return s * f;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值