ZYCode ICPC Round 7 吃饭
O(n^3) 解法
对于每个
O(n^2) 解法
对于每组
O(n) 解法
考虑
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
int n,ans;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
int cnt=1,t=i*2;
while(t%2==0)cnt*=2,t/=2;
ans+=i-i/cnt;
ans%=1226999999;
}
cout<<ans;
return 0;
}
O(\log n) 做法
注意到
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1226999999;
int n,ans;
int last(int i){
int t=n/i*i;
if(t/i%2==0)t-=i;
return t;
}
int sum(int st,int ed,int gc){
if((st+ed)%2==0)return (st+ed)/2%mod*(((ed-st)/gc+1)%mod)%mod;
return ((ed-st)/gc+1)/2%mod*((st+ed)%mod)%mod;
}
signed main(){
// freopen("10.in","r",stdin);
// freopen("10.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i*=2){
int end=last(i);
ans+=sum(i,end,i*2)-sum(0,end/i/2,1);
ans=(ans+mod)%mod;
}
cout<<ans;
return 0;
}