P9101 [PA2020] Skierowany graf acykliczny
题目传送门
一道思维题。
思路
由于每个点只能连两条出边,而不同路径数又是从前面累加的(这里规定编号从小到大,更方便,毕竟谁也不喜欢乱编号吧),
我突发奇想可以用二进制来累加成
一个点有且至少一条,至多两条入边,即为路径数的累加。以此,对于节点
点个赞再走啊
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll k,sum[101],cnt,num,n,ab,a[101];
int main(){
// freopen("s.in","r",stdin);
// freopen("s.out","w",stdout);
scanf("%lld",&k);
if(k==1){
cout<<2<<'\n'<<2<<' '<<-1<<'\n'<<-1<<' '<<-1;
exit(0);
}sum[1]=1;
num=cnt=1;
while(num*2-1<k){
num*=2;
sum[++cnt]=num;
}ab=k,n=cnt*2+1;
for(int i=cnt;i;i--)
if(ab>=sum[i])ab-=sum[i],a[i*2]=1;
cout<<n<<'\n';
for(int i=1;i<=n;i++)
if(i==n)
cout<<-1<<' '<<-1;
else if(i==n-2||i==n-1)
cout<<i+1<<' '<<-1<<'\n';
else
if(i%2==0)
if(!a[i])cout<<i+1<<' '<<-1<<'\n';
else cout<<i+1<<' '<<n<<'\n';
else cout<<i+1<<' '<<i+2<<'\n';
return 0;
}