(k+1)|(n+k)
就是
(k+1)|(n−1)
这个函数就是最大的
k
使得
随便容斥下咯
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline ll Gcd(ll a,ll b){
return !b?a:Gcd(b,a%b);
}
inline ll Sum(ll n,ll x){
n/=x;
return n*(n+1)/2*x+n;
}
inline ll Cnt(ll n,ll x){
return n/x;
}
inline int f(int n){
for (int i=0;;i++)
if ((n+i)%(i+1)!=0)
return i;
}
inline int g(int n){
n--;
for (int i=1;;i++)
if (n%i!=0)
return i-1;
}
int main(){
ll Ans=0,ans2=0;
ll lcm=1,nxt;
for (int i=1;i<=31;i++){
ll n=1LL<<(i<<1);
//for (int j=2;j<n;j++)
// if (f(j)==i)
//ans2++;
nxt=lcm*(i+1)/Gcd(lcm,i+1);
Ans+=Cnt(n-2,lcm)-Cnt(n-2,nxt);
lcm=nxt;
}
printf("%lld\n",Ans);
return 0;
}