CF1469D Ceil Divisions
题目
这道题如果直接用小数除以大数的话,最后一个大数就要除很多次,此时我们可以在中间找一个数,这样次数就不会超过(n+5)了。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,t,a[500005][2],total;
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int i,j;
cin>>t;
while(t--)
{
cin>>n;
total=0;
if(n<=6)
{
for(i=3; i<=n; i++)
{
int l=i;
while(l!=1)
a[++total][0]=i,a[total][1]=2,l=(l+1)/2;
}
cout<<total<<endl;
for(i=1; i<=total; i++)
cout<<a[i][0]<<' '<<a[i][1]<<endl;
}
else if(n>=18)
{
for(i=18; i<=n; i++)
a[++total][0]=i-1,a[total][1]=i;
for(i=5; i<=16; i++)
a[++total][0]=i-1,a[total][1]=i;
int l=n;
while(l!=1)
a[++total][0]=n,a[total][1]=16,l=(l+15)/16;
a[++total][0]=16,a[total][1]=3,a[++total][0]=16, a[total][1]=3,a[++total][0]=16,a[total][1]=3,a[++total][0]=3,a[total][1]=2,a[++total][0]=3,a[total][1]=2;
cout<<total<<endl;
for(i=1; i<=total; i++)
{
cout<<a[i][0]<<' '<<a[i][1]<<endl;
}
}
else if(n>6&&n<18)
{
for(i=4; i<=n; i++)
a[++total][0]=i-1,a[total][1]=i;
int l=n;
while(l!=1)
a[++total][0]=n,a[total][1]=2,l=(l+1)/2;
cout<<total<<endl;
for(i=1; i<=total; i++)
cout<<a[i][0]<<' '<<a[i][1]<<endl;
}
}
return 0;
}