A:显然 交替加 增大最快
#include
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
ll a,b,n;
cin>>a>>b>>n;
int z=0;
while(1)
{
if(max(a,b)>n)break;
if(a>b)swap(a,b);
a+=b;
z++;
}
cout<
B:指数级增大肯定是最快的。
#include
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)ans=ans*a;
a=a*a;
b/=2;
}
return ans;
}
char s[11]={"codeforces"};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll k;
cin>>k;
int id=0;
for(int i=1;i<=100;i++)
{
if(qpow(i,10)>k)
{
id=i-1;
break;
}
}
int z=0;
ll ans=qpow(id,10);
for(int i=1;i<=10;i++)
{
if(ans>=k)break;
ans=ans/id*(id+1);
z++;
}
for(int i=1;i<=10;i++)
{
int tp=id;
if(i<=z)tp++;
for(int j=1;j<=tp;j++)cout<
C:2*2的方格刚好满足每个格子周围两个黑色。 两个2*2边角相连刚好可以造出一个四周全是黑色的情况
#include
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
void pr(int i)
{
printf("%d %d\n",1+i,i);printf("%d %d\n",2+i,i);
printf("%d %d\n",0+i,i+1);printf("%d %d\n",2+i,i+1);
printf("%d %d\n",0+i,i+2);printf("%d %d\n",1+i,i+2);printf("%d %d\n",2+i,i+2);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
printf("%d\n",7*n+8);
printf("%d %d\n",0,0);printf("%d %d\n",1,0);printf("%d %d\n",2,0);
printf("%d %d\n",0,1);printf("%d %d\n",2,1);
printf("%d %d\n",0,2);printf("%d %d\n",1,2);printf("%d %d\n",2,2);
for(int i=1;i<=n;i++)pr(i*2);
return 0;
}
D:a|b, a&b 的结果只是让a,b的某个数的某几位的1移到另一个数。
最后统一分配1即可。尽量让数凑得大。
#include
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
int nm[M];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,sm=0;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
for(int j=0;j<20;j++)
{
if((x>>j)&1)
nm[j]++;
sm++;
}
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ll tp=0;
for(int j=19;j>=0;j--)
{
if(nm[j]&&sm>n-i)
{
tp+=(1<