【Codeforces Round #499 (Div. 1) B】Rocket

weixin_30588675發表於2020-04-05

【連結】 我是連結,點我呀:)
【題意】


讓你猜到火星的距離x是多少.
已知1<=x<=m
然後你可以問系統最多60個問題
問題的形式以一個整數y表示
然後系統會回答你3種結果
-1 x<y
0 x=y
1 x>y
但是系統有時候會撒謊
這個撒謊的過程由一個長度為n的序列決定
n<=30
如果p[i]=1表示它對接下來的詢問不會撒謊
p[i]=0表示它對接下來的詢問會撒謊
撒謊之後系統會輸出-ans
如果問的個數>=n了那麼重新從1開始
p陣列未知
但是長度n告訴你了

【題解】


前n個問題一直問m
看看系統回答什麼,回答0直接輸出m,否則根據這個詢問來確定系統說的是真話還是假話。
從而得到p陣列。
然後根據p陣列寫個二分就能最後問出距離啦

【程式碼】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define res(x) scanf("%s",x)
#define rson mid+1,r,rt<<1|1
using namespace std;

const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int N = 1e5;

int n,k,a[N+10],g;
int flag[N+10];

int main(){
    #ifdef LOCAL_DEFINE
        freopen("rush_in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> n >> k;
    for (int i = 1;i <= n;i++) cin >> a[i];
    g = a[1];
    for (int i = 2;i <= n;i++) g = __gcd(g,a[i]);
    for (int s = 0,i = 1;i <= k;s = (s+g)%k,i++) flag[s] = 1;
    int cnt = 0;
    for (int i = 0;i <k;i++) if (flag[i]) cnt++;
    cout<<cnt<<endl;
    for (int i = 0;i < k;i++) if (flag[i]) cout<<i<<' ';
    return 0;
}

轉載於:https://www.cnblogs.com/AWCXV/p/9379525.html

相關文章