日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数学】异或(jzoj 2298)

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数学】异或(jzoj 2298) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

異或

jzoj 2298

題目大意:

定義nbnbnb數對a,ba,ba,bgcd(a,b)=abgcd(a,b)=a^bgcd(a,b)=ab的數對,問不大于nnnnbnbnb數對有多少對

輸入樣例#1

12

輸出樣例#1

8

輸入樣例#2

123456

輸出樣例#2

214394

數據范圍

測試點數據規模
110
2100
31000
45000
510000
6100000
7500000
81000000
95000000
1020000000

解題思路:

我們第一個想到的就是暴力枚舉每一個數對,然后判斷,時間復雜度o(n2logn)o(n^2log_n)o(n2logn?)會TLE
因為axorb=ca\ xor\ b=ca?xor?b=c,則axorc=ba\ xor\ c=ba?xor?c=b,所以我們可以枚舉c,然后在枚舉a是c的幾倍,然后用公式求出b,然后再求gcd,判斷是否和c一樣,時間復雜度o(n(logn)2)o(n(log_n)^2)o(n(logn?)2),也會TLE
我們可以經過證明得知b=a-c
證明:
首先a?b?axorba-b\leqslant a\ xor\ ba?b?a?xor?b
我們距離兩個二進制數:
101101011010110
110001100011000
他們相減是222
xorxorxor是14
我們可以發現xorxorxor是不同位的和
而相減是加某些不同位,再減某些不同位,最大就是所有不同位加,也不大于xorxorxor
所以a?b?axorba-b\leqslant a\ xor\ ba?b?a?xor?b
然后我們可以發現a?b?ca-b\leqslant ca?b?c
我們也列兩個例子:
a=12a=12a=12
b=9b=9b=9
c=3c=3c=3
我們設as=a/c=4as=a/c=4as=a/c=4
bs=b/c=3bs=b/c=3bs=b/c=3
因為a,b都是c的倍數,所以a?b=as?c?bs?c=(as?bs)?ca-b=as*c-bs*c=(as-bs)*ca?b=as?c?bs?c=(as?bs)?c
因為aaa不等于bbb
所以as?bs?1as-bs\geqslant 1as?bs?1
所以(as?bs)?c?c(as-bs)*c\geqslant c(as?bs)?c?c
所以a?b?ca-b\geqslant ca?b?c
假設存在c<a?bc<a-bc<a?b
c<a?b?axorbc<a-b\leqslant a\ xor\ bc<a?b?a?xor?b
不滿足c=axorbc=a\ xor\ bc=a?xor?b
所以c=a?bc=a-bc=a?b
所以b=a?cb=a-cb=a?c
因此gcd(a,b)=gcd(a,a?c)=cgcd(a,b)=gcd(a,a-c)=cgcda,b=gcd(a,a?c)=c
所以我們只需判斷是否有c=axorbc=a\ xor \ bc=a?xor?b即可

代碼:

#include<cstdio> using namespace std; int n,a,b,ans; int main() {scanf("%d",&n);for (int i=1;i<=(n>>1);++i)for (int j=2;i*j<=n;++j){a=i*j;//求出ab=a-i;//相減得到bif (i==(a^b))//判斷c是否等于a^bans++;}printf("%d",ans); }

總結

以上是生活随笔為你收集整理的【数学】异或(jzoj 2298)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。