专栏文章
题解:CF2039C2 Shohag Loves XOR (Hard Version)
CF2039C2题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miqyure0
- 此快照首次捕获于
- 2025/12/04 12:59 3 个月前
- 此快照最后确认于
- 2025/12/04 12:59 3 个月前
仅以此题纪念我赛时会但是写挂了一万年的 C2。
题意翻译
组数据。
求 中满足 或 的 的数量。
求 中满足 或 的 的数量。
sol
分类讨论两种情况。
当 时,令 ,,得 。
令 ,得 。
因此当 时, 一定满足 ,由异或运算后非负的性质可得 或 ,我们需要排除后者 ,即 时,因此我们把 中 的数量统计起来。
或 时由值域得可能满足答案,需要特判。
当 时,令 ,,得 。
令 ,得 。
因此当 时, 一定满足 ,由异或运算后非负的性质可得 或 ,我们需要排除后者 ,即 时,因此我们把 中 的数量统计起来。
或 时由值域得可能满足答案,需要特判。
当 时,若 ,我们可以用枚举的方式统计。
当 时,令 , 当且仅当 时等号成立。
令 ,得 。
令 ,得 ,舍去。
令 ,得 ,所以 ,不符合题意,舍去。
当 时,令 , 当且仅当 时等号成立。
令 ,得 。
令 ,得 ,舍去。
令 ,得 ,所以 ,不符合题意,舍去。
至此我们已处理完所有情况,但是我们可能有重复的情况,我们需要去重。
前者中 , 时 。 其他情况下由 得 ,但 时 故 。
后者由前面的讨论得 ,两者的交为 ,不要重复统计此情况即可。
后者由前面的讨论得 ,两者的交为 ,不要重复统计此情况即可。
空间复杂度为 。
时间复杂度的开销主要在枚举,复杂度为 。
时间复杂度的开销主要在枚举,复杂度为 。
代码如下。
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int x;
ll m,ans;
template<typename T>
T read(){
T f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
return f*x;
}
namespace sol{
void solve(){
ans=0;
x=read<int>();m=read<ll>();
ll j=m/x;
ans+=j;
if(1<=((j*x)^x)&&((j*x)^x)<=m)++ans;
if(1<=(((j+1)*x)^x)&&(((j+1)*x)^x)<=m)++ans;
if(j-1>=1)--ans;//排除y=0的情况
for(int y=1;y<=min((ll)(x-1),m);++y){
if((x^y)%y==0){
++ans;
}
}
printf("%lld\n",ans);
}
}
int main(){
int T=read<int>();
while(T--)sol::solve();
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...