博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 12716 GCD XOR
阅读量:5167 次
发布时间:2019-06-13

本文共 1260 字,大约阅读时间需要 4 分钟。

链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=594&problem=4669&mosmsg=Submission+received+with+ID+2196163

题意:给定n(1<=n<=3e7),求有多少对整数(a,b)满足1<=b<=a<=n,gcd(a,b)=a^b。

分析:设gcd(a,b)=c,a^b=c等价于a^c=b,因此可以枚举a和c,然后检查gcd(a,a^c)==c,复杂度为O(n(longn)^2),果断T。。实际上满足条件的数对必然满足b=a-c,因为b=a^c>=a-c,c=gcd(a,b)=gcd(a-b,b)<=a-b。因此只需要检验c==a^(a-c)。

复杂度为O(nlogn),大约是7e8,但是有多组数据,因此要预处理前3e7个,记第i个为dp[i],a=i时的数对有_a[i]对 ,则dp[i]=dp[i-1]+_a[i],可以线性处理,总的复杂度为O(nlogn)。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 const int maxn=3e7+5; 7 bool have[maxn]; 8 long long _a[maxn],dp[maxn]; 9 long long ans=0;10 void solve(){11 ans=0;12 for(int c=1;c<=maxn;c++){13 for(int a=2*c;a<=maxn;a+=c){14 if((a^(a-c))==c)_a[a]++;15 }16 }17 }18 int main(){19 //freopen("e:\\in.txt","r",stdin);20 memset(_a,0,sizeof(_a));21 solve();22 dp[1]=0;23 for(int i=2;i
>t;28 for(int kase=1;kase<=t;kase++){29 scanf("%d",&n);30 printf("Case %d: %d\n",kase,dp[n]);31 }32 return 0;33 }

 

转载于:https://www.cnblogs.com/7391-KID/p/7082379.html

你可能感兴趣的文章
hadoop17---RPC和Socket的区别
查看>>
使用JMeter代理录制app测试脚本
查看>>
Linq to Object实现分页获取数据
查看>>
mac常用系统命令
查看>>
android上传文件到服务器
查看>>
我回答了90%的面试题,为什么还被拒?
查看>>
Html - Table 表头固定和 tbody 设置 height 在IE不起作用的解决
查看>>
HDU 2262 回溯算法 递归枚举
查看>>
九度0J 1374 所有员工年龄排序
查看>>
微信小程序图片使用示例
查看>>
Ubuntu16.04+cuda8.0rc+opencv3.1.0+caffe+Theano+torch7搭建教程
查看>>
GitHub 优秀的 Android 开源项目
查看>>
CentOS 网络设置修改
查看>>
二分图
查看>>
python小白-day5 random模块
查看>>
Git Tips
查看>>
2019春第一次课程设计报告
查看>>
msp430项目编程13
查看>>
用Python3实现的Mycin专家系统简单实例
查看>>
TortoiseSVN tutorial
查看>>