A. Ehab and another construction problem
暴力搜索
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
int main(){
int x;
cin>>x;
for(int i=1;i<=x;i++){
for(int j=i;j<=x;j+=i){
if(i*j>x&&j/i<x){
printf("%d %d\n",j,i);
return 0;
}
}
}
printf("-1\n");
return 0;
}
B. Ehab and subtraction
容易得出输出的是相邻两个元素的差(差不为零的时候)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
int a[maxn],n,k;
int main(){
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
if(!a[n-1]){
while(k--)
cout<<0<<endl;
return 0;
}
int x = 0,j = 0;
while(j<n&&!a[j])j++;
while(j<n&&k){
while(j<n&&a[j]-a[j-1]==0)j++;
if(j!=n)
cout<<a[j]-a[j-1]<<endl;
else
cout<<0<<endl;
j++,k--;
}
while(k--)
cout<<0<<endl;
return 0;
}
C. Ehab and a 2-operation task
先将所有数变成0(%1),然后都加一个1e6,从1到n-1依次模一个递减的数(从1e6开始)
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n;
int main(){
cin>>n;
int x = 1e6;
cout<<n+1<<endl;
printf("2 %d 1\n",n);
printf("1 %d %d\n",n,x--);
for(int i=1;i<n;i++)
printf("2 %d %d\n",i,x--);
return 0;
}
D
来源------我是超链接、
神仙交互题,看到是很好看懂,但是自己根本想不出
#include <bits/stdc++.h>
int query(int a, int b, int ret = 0) {
printf("? %d %d\n", a, b);
fflush(stdout);
scanf("%d", &ret);
return ret;
}
int main() {
int a = 0, b = 0;
bool aIsBigger = true;
if(query(a, b) < 0) aIsBigger = false;
for(int i = 29; ~i; i--) {
int x = query(a ^ (1 << i), b), y = query(a, b ^ (1 << i));
if(x == y) {
if(aIsBigger) a ^= (1 << i);
else b ^= (1 << i);
aIsBigger = (x == 1);
}
else if(x == -1 && y == 1) a ^= (1 << i), b ^= (1 << i);
}
printf("! %d %d\n", a, b);
return 0;
}