【数学】异或(jzoj 2298)
異或
jzoj 2298
題目大意:
定義nbnbnb數(shù)對(duì)a,ba,ba,b為gcd(a,b)=abgcd(a,b)=a^bgcd(a,b)=ab的數(shù)對(duì),問(wèn)不大于nnn的nbnbnb數(shù)對(duì)有多少對(duì)
輸入樣例#1
12輸出樣例#1
8輸入樣例#2
123456輸出樣例#2
214394數(shù)據(jù)范圍
| 1 | 10 |
| 2 | 100 |
| 3 | 1000 |
| 4 | 5000 |
| 5 | 10000 |
| 6 | 100000 |
| 7 | 500000 |
| 8 | 1000000 |
| 9 | 5000000 |
| 10 | 20000000 |
解題思路:
我們第一個(gè)想到的就是暴力枚舉每一個(gè)數(shù)對(duì),然后判斷,時(shí)間復(fù)雜度o(n2logn)o(n^2log_n)o(n2logn?)會(huì)TLE
因?yàn)?span id="ze8trgl8bvbq" class="katex--inline">axorb=ca\ xor\ b=ca?xor?b=c,則axorc=ba\ xor\ c=ba?xor?c=b,所以我們可以枚舉c,然后在枚舉a是c的幾倍,然后用公式求出b,然后再求gcd,判斷是否和c一樣,時(shí)間復(fù)雜度o(n(logn)2)o(n(log_n)^2)o(n(logn?)2),也會(huì)TLE
我們可以經(jīng)過(guò)證明得知b=a-c
證明:
首先a?b?axorba-b\leqslant a\ xor\ ba?b?a?xor?b
我們距離兩個(gè)二進(jìn)制數(shù):
101101011010110
110001100011000
他們相減是222
xorxorxor是14
我們可以發(fā)現(xiàn)xorxorxor是不同位的和
而相減是加某些不同位,再減某些不同位,最大就是所有不同位加,也不大于xorxorxor
所以a?b?axorba-b\leqslant a\ xor\ ba?b?a?xor?b
然后我們可以發(fā)現(xiàn)a?b?ca-b\leqslant ca?b?c
我們也列兩個(gè)例子:
a=12a=12a=12
b=9b=9b=9
c=3c=3c=3
我們?cè)O(shè)as=a/c=4as=a/c=4as=a/c=4
bs=b/c=3bs=b/c=3bs=b/c=3
因?yàn)閍,b都是c的倍數(shù),所以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
因?yàn)?span id="ze8trgl8bvbq" class="katex--inline">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
假設(shè)存在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); }總結(jié)
以上是生活随笔為你收集整理的【数学】异或(jzoj 2298)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux重启网卡的方法
- 下一篇: 【死磕opensips】sip协议解析