【数学】异或(jzoj 2298)
異或
jzoj 2298
題目大意:
定義nbnbnb數對a,ba,ba,b為gcd(a,b)=abgcd(a,b)=a^bgcd(a,b)=ab的數對,問不大于nnn的nbnbnb數對有多少對
輸入樣例#1
12輸出樣例#1
8輸入樣例#2
123456輸出樣例#2
214394數據范圍
| 1 | 10 |
| 2 | 100 |
| 3 | 1000 |
| 4 | 5000 |
| 5 | 10000 |
| 6 | 100000 |
| 7 | 500000 |
| 8 | 1000000 |
| 9 | 5000000 |
| 10 | 20000000 |
解題思路:
我們第一個想到的就是暴力枚舉每一個數對,然后判斷,時間復雜度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)=cgcd(a,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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux重启网卡的方法
- 下一篇: 纪中C组模拟赛总结(2019.8.9)