A

思路:B=1时输出NO ,其他情况输出YES即可。关键在于要一个good和两个nearly,最简单的good就是A*B,另外再找两个nearby即可,注意到i和i-1必然互质的性质可知这两个数字是A*(B-1),A*(2B-1).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//team lots of balloons
//author: CN.TTDragon
#include<bits/stdc++.h>
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1e5+7;
const double pi=acos(-1);
using namespace std;
ll _,n,m;
int main()
{
ios::sync_with_stdio(false);
//freopen("in.in","r",stdin);
//freopen("mine.out","w",stdout);
for(cin>>_;_;_--)
{
cin>>n>>m;
if(m==1)
{
cout<<"NO"<<endl;
continue;
}
cout<<"YES"<<endl;
ll a[3];
a[0]=n*m;
a[1]=n*(m-1);
a[2]=n*(2*m-1);
int good=0,near=0;
for(int i=0;i<3;i++)
{
if(a[i]%(n*m)==0)
{
good++;
}
else if (a[i]%n==0)
{
near++;
}
}
//cout<<good <<" \t "<<near<<endl;
if(m&1)
{
cout<<n*m<<" "<<n*(m-1)<<" "<<n*(2*m-1)<<endl;
}
else
{
cout<<n*m<<" "<<n*(m-1)<<" "<<n*(2*m-1)<<endl;
}

}
return 0;
}

B

思路:还是上面的性质,i和i+1互质,找到整个数组最小值,把它放到第一位.从左到右,每个数都比前一个数大1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//team lots of balloons
//author: CN.TTDragon
#include<bits/stdc++.h>
typedef long long ll;
const ll mod=2e9-7;
const ll maxn=1e5+7;
const double pi=acos(-1);
using namespace std;
int _,n,m;
ll a[maxn];
ll mi,mip;

int main()
{
ios::sync_with_stdio(false);
//freopen("in.in","r",stdin);
//freopen("mine.out","w",stdout);
for(cin>>_;_;_--)
{
cin>>n;
mi=mod;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]<mi)
{
mi=a[i];
mip=i;
}
}
if(n==1)
{
cout<<0<<endl;
continue;
}
cout<<n-1<<endl;
if(mip!=1)
cout<<1<<" "<<mip<<" "<<mi<<" "<<mi+mip-1<<endl;
for(int i=2;i<=n;i++)
{
if(i!=mip)
cout<<1<<" "<<i<<" "<<mi<<" "<<mi+i-1<<endl;
}
}

return 0;
}

C

思路:本质就是找最大值或者最小值,这里以最大值为例。想要返回你最大值,必然有X=n-1,且a_{j}=n。这时当返回值等于n-1时可以去交换i和j,避免最大值被放到位置i上。因为最大值在i上,返回值必然是n-1。
这么做每次可以确定两个位置是否含有最大值,得到最大值之后在遍历数组每个位置即可得到序列的样子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//team lots of balloons
//author: CN.TTDragon
#include<bits/stdc++.h>
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1e4+7;
const double pi=acos(-1);
using namespace std;
int _,n,m;
int mx;
int q;
int a[maxn];
queue<int> que;
int main()
{
ios::sync_with_stdio(false);
//freopen("in.in","r",stdin);
//freopen("mine.out","w",stdout);
for(cin>>_;_;_--)
{
cin>>n;
mx=0;
//ÕÒ×î´óÖµ
for(int i=1;i<=n-1;i+=2)
{
cout<<"? 1 "<<i<<" "<<i+1<<" "<<n-1<<endl;
cout.flush();
cin>>q;
if(q==n)
{
mx=i+1;
a[i+1]=n;
break;
}
else if(q==n-1)
{
cout<<"? 1 "<<i+1<<" "<<i<<" "<<n-1<<endl;
cout.flush();
cin>>q;
if(q==-1)
{
break;
}
if(q==n)
{
mx=i;
a[i]=n;
break;
}
}
}
if(mx==0)
{
mx=n;
a[mx]=n;
}
for(int i=1;i<=n;i++)
{
if(i==mx)
{
continue;
}
cout<<"? 2 "<<i<<" "<<mx<<" "<<1<<endl;
cout.flush();
cin>>q;
a[i]=q;
}
cout<<"! ";
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
cout.flush();
}
return 0;
}

写在最后
交互题除了二分就是遍历了吧,等着被打脸。
D题,想了一晚上没想明白如何变成一个个链,看了半天别人的代码也没明白。菜是原罪!