1. 程式人生 > >Uva12716 GCD XOR 亂搞

Uva12716 GCD XOR 亂搞

Description


i = 1 n

j = 1 n [ g c d
( i , j ) = i j ]
\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)=i \oplus j]
其中那個符號是按位異或
n<=1e6

Solution


我們欽定 a &gt; b a&gt;b
首先證明 g c d ( a , b ) a b gcd(a,b)\leq a-b
g c d ( a , b ) = g c d ( b , a b ) a b gcd(a,b)=gcd(b,a-b)\leq a-b ,由輾轉相減可知等式成立,且a和b的約數不大於min(a,b)

然後有 a b a b a\oplus b\geq a-b
我們把 a a 中是0且 b b 中是1的位置交換,記為 a a&#x27; b b&#x27;
a b = a b = a b a&#x27;\oplus b&#x27;=a&#x27;-b&#x27;=a\oplus b
然後就可以發現 a b = a b a b a\oplus b=a&#x27;-b&#x27;\geq a-b 是成立的

綜合一下看可以發現 g c d ( a , b ) = a b = a b gcd(a,b)=a\oplus b=a-b
c = a b c=a-b ,有 g c d ( a , b ) = g c d ( b , a b ) = a b gcd(a,b)=gcd(b,a-b)=a\oplus b
然後套c進去有 g c d ( b , c ) = c gcd(b,c)=c ,於是我們列舉c,列舉c的倍數就可以nlogn做了

Code


口胡題解不寫程式碼