2016-2017 7th BSUIR Open Programming Contest. Semifinal
B. Traveling Salesman Problem
构造01串,0表示x/2,1表示1-x,得到指定分数
X初始为1
给你 a,b
分数为a/2^b(保证a为奇数,且2^a<2^b)
这样可以保证不会约分,就是不断地转换
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll sum[100];
int cnt[100];
int main()
{
ll a,b;
cin>>a>>b;
sum[0]=1;
for(int i=1;i<=61;i++)
{
sum[i]=sum[i-1]*2;
}
if(a==1)
{
for(int i=1;i<=b;i++)
printf("0");
return 0;
}
int tot=0;
while(a>=3)
{
for(int i=0;i<=61;i++)
{
if(sum[i]>a)
{
cnt[++tot]=i;
a=sum[i]-a;
break;
}
}
}
cnt[++tot]=0;
for(int i=tot;i>=2;i--)
{
for(int j=1;j<=cnt[i-1]-cnt[i];j++)
{
printf("0");
}
printf("1");
}
if(cnt[1]<b)
{
for(int i=b;i>cnt[1];i--)
cout<<"0";
}
return 0;
}
/*
87 2^7-87=41
41 2^6-41=23
23 2^5-23=9
9 2^4-9=7
7 2^3-7=1;
00010101
*/