题解 P3764 【签到题 III】

· · 题解

听说没人证出、、其实dalao们都是懒得证或者懒得说吧。。

证:当且仅当 i+j=2^{k+1} (i,j)=1 时, f(i,j)=k ;其余情况 f(i,j)=0

一些引理:

f(\lambda a,\lambda b)=f(a,b)\ \ \ \ (\lambda>0) f(a,b)=f(b,a)

必要性证明:当 i+j=2^{k+1} (i,j)=1 时, f(i,j)=k

不妨设 i>j ,因为 i,j 互质则有 i,j 都是奇数。

f(i,j)=f(i-j,2j)+1=f(\frac{i-j}{2},j)+1

因为 (i,j)=1 ,所以 (i-j,j)=1=(\frac{i-j}{2},j)

这是一个递归的过程,不同的是, i+j=2^{k+1},\frac{i-j}{2}+j=2^{k}

故终止时为 f(a,b)|a+b=2^{1}=2 ,即 f(i,j)=f(1,1)+k=k

充分性证明:当 i+j≠2^{k} (i,j)=1 时, f(i,j)=0

(1)i+j=s≡1(mod\ 2)

因为 (i,j)=1 i,j 一奇一偶,

i>j,f(i,j)=f(i-j,2j);

i<j,f(i,j)=f(2i,j-i);

因为 (i-j,2j) (2i,j-i) 仍然满足一奇一偶(≠)且和为\frac{s}{gcd(i-j,2j)}\frac{s}{gcd(2i,j-i)}(不可能为2^{k}),则其永远无法到达终止状态。

f(i,j)=0

(2)i+j=2^{t}·s≡0(mod\ 2)

i>j ,则有 f(i,j)=f(i-j,2j)=f(\frac{i-j}{2},j)

\frac{i-j}{2}+j=\frac{i+j}{2}=2^{t-1}·s ,

故其可以在有限步递归内转换为 i+j=s≡1(mod\ 2) 即第(1)种情况。

f(i,j)=0

综上得证。

证by shyakocat

有了这个,我们容易知道公式

Ans=\sum_{i=1,i≡1(mod\ 2)}^{n}\lceil log_{2}(i) \rceil \lfloor \frac{n}{i} \rfloor

就是对每个i考虑 1<j<i i+j=2^{k} (i,j)=1 ,这样的j显然有且仅有1个。再算上倍数即可。

由于很多i的答案一样,可以合并下,时间复杂度 O(\sqrt[]{N}+log(N))

var
 n,i,j,a,b,ans:int64;

function min(const a,b:int64):int64;
begin if a>b then exit(b); exit(a) end;

begin
 read(n);
 i:=1;
 while i<=n do
 begin
  a:=n div i;
  b:=trunc(ln(i)/ln(2)+1e-7);
  j:=min(n div a,int64(1)<<(b+1));
  inc(ans,a*b*((j-i+1+j and 1)>>1));
  i:=j+1
 end;
 write(ans*2)
end.