hdu 5175 Misaki's Kiss again(GCD和异或)
2024-09-07 03:05:46
题意:
给一个数N。
如果GCD(N,M) = N XOR M,则称M是一个kiss 1<=M<=N
问总共有多少个kiss。并且列出所有的值。
思路:
思路一:枚举M。有大量的GCD(N,M)值相等。但是N XOR M=X。当X是定值是,M一定只有一个。所以这个方法明显有大量重复。
发现知道GCD(N,M)的值,可直接求出M。搞定。
令gcd(n,m)=d,可知道d是n的约数
有d=(n xor m)=(m xor n),所以m=(d xor n)。
可发现gcd(n,(d xor n))=d。
*注意:gcd(a,b) 当a或b为零时,gcd(a,b)的值为1。这个要单独判断。
还有一个(d xor n)有可能大于n。这个也要单独判断。
代码:
ll N; ll gcd(ll a,ll b){
if(b==0) return a;
return gcd(b,a%b);
} int T = 0;
ll ans[100005];
int kissNum; int main(){ while(scanf("%I64d",&N)!=EOF){ kissNum = 0; for(ll i=1;i*i<=N;++i){
if(N%i==0){
ll x = N^i;
if(x>0 && x<=N && gcd(N,x)==i){
ans[++kissNum] = x;
}
ll t = N/i;
if(t!=i){
ll xx = N^t;
if(xx>0 && xx<=N && gcd(N,xx)==t){
ans[++kissNum] = xx;
}
}
}
} printf("Case #%d:\n%d\n",++T,kissNum);
if(kissNum>0){
sort(ans+1,ans+1+kissNum);
printf("%I64d",ans[1]);
rep(i,2,kissNum) printf(" %I64d",ans[i]);
}
cout<<endl;
} return 0;
}
最新文章
- 安装MySQL5.7
- OceanBase RPC机制简要说明
- scala模式匹配
- T4 assembly
- GNU C/C++ __attributes__ GCC中的弱符号与强符号
- Fragment inner class should be static
- 实现一个基于FTP协议的程序——文件上传下载器(十三)
- keepalived+mysql双主复制高可用方案
- 每天一个linux命令(47)--scp命令
- java学习笔记随记
- 《跟我学IDEA》二、配置maven、git、tomcat
- Windows实用命令
- 记一次mongodb聚合查询
- OpenCV尝试
- openSUSE Leap 15.0 Adobe Flash Player 安装说明
- 使用flask_socketio实现客户端间即时通信
- [MySQL]InnoDB引擎的行锁和表锁
- PythonStudy——函数的分类 Classification of functions
- BZOJ 4004 [JLOI2015]装备购买 | 线性基
- python面向对象 : 反射和内置方法