您的位置:首页 > 理论基础 > 计算机网络

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E. Maximum Flow

2017-09-17 08:21 344 查看
小数据打表之后找规律,,

发现了规律是

https://www.jisuanke.com/contest/876/44180

F题

也可以参考http://blog.csdn.net/tzc_anruoxin/article/details/78005515

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
#include<set>

using namespace std;

const int maxn = 100;
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
const ll mod= 1e9+7;

ll a[maxn];
ll Pow[maxn];

void init(){
a[0]=1;
Pow[0]=1;
for(ll i=1;i<=62;i++){
a[i]=a[i-1]*2;
Pow[i]=(a[i]%mod)*(a[i]%mod)%mod;
//  cout<<i<<' '<<a[i]<<' '<<Pow[i]<<endl;
}
}

ll ans(ll x){
ll sum=0;
ll n=x;
for(ll j=0;(1LL<<j)<=x;j++){
ll temp=(x>>(j+1));
if(x&(1LL<<j)) temp++;
//  cout<<temp<<' '<<Pow[j]+1<<endl;
temp=(temp%mod)*(Pow[j]+1)%mod;
sum=(sum+temp)%mod;
}
ll sub=0;
for(int i=0;i<=62;i++){
if(x>=a[i]) {
ll c1=(a[i]%mod);
ll c2=(a[i]/2)%mod;
sub=((sub+(c1*c1-c2*c2))%mod+mod)%mod;
//      cout<<"-------"<<(a[i]*a[i]-a[i]*a[i]/4)<<endl;
}
else break;
}
sum=(sum+mod-sub)%mod;
return sum;
}

int main(){
init();
ll n;
while(cin>>n){
cout<<ans(n-1)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐