Codeforces Round #691 (Div. 2)

 A. Red-Blue Shuffle

这题求问概率没啥好说的,首位决定一切,比较首位个数。

B. Move and Turn

竖着走以后只能横着走,横着走以后只能竖着走。

开始像暴力搜索,然后炸了。炸了以后开始找规律。

按他的说法打表,打出来以后按奇偶位找规律。

打表代码如下

ll id=0;
struct node{
    int x,y;
    int dir;
    int step;      
    ll num;               
    bool operator<(const node& a) const{
        return num<a.num;
    }
};
queue<node>q;
map<pair<int, int> ,int> mp;
map<node,int>mp2;
int main(){
    int n;cin>>n; 
        ll ans=0,num=0;
        q.push((node){1,1,0,0,++id});
        q.push((node){1,1,1,0,++id});
        while(!q.empty()){
            node now=q.front();
            q.pop();
            if(mp2[now]==0){
                mp2[now]++;
            }
            else{
                continue;
            }
            if(now.step==n){
                pair<int ,int > pp= make_pair(now.x,now.y);
                if(mp[pp]==0){
                    mp[pp]=1;
                    ans++;
                }
            }
            else{
                if(now.dir==1){
                    q.push((node){now.x+1,now.y,0,now.step+1,++id});
                    q.push((node){now.x-1,now.y,0,now.step+1,++id});
                }
                else if(now.dir==0){
                    q.push((node){now.x,now.y+1,1,now.step+1,++id});
                    q.push((node){now.x,now.y-1,1,now.step+1,++id});
                }
            }
        }
        cout<<ans<<endl;
    return 0;
}

ac代码如下:

const int N=1e4+7;
int a[N],pos=1,num=0;
int main(){
    int n;
    for(int i=1;i<=1000;++i){
        num+=i;
        a[pos]=4*num;
        pos+=2;
    }
    for(int i=1;i<=1000;++i){
        if(i%2==0){
            a[i]=(i/2+1)*(i/2+1);
        }    
    }
    cin>>n;
    cout<<a[n]<<endl;
    return 0;
}

C. Row GCD

我们目标是求出GCD(a1+k,a2+k,a3+k,a4+k,.......,an+k)

我们学过辗转相减法,GCD(a,b)=GCD(a,b-a)

而上面的一大串东西,实际上两两求GCD,那么两个之间就能合法的消去k

继而我们得到原式=GCD(a1+k,a2-a1,a3-a2,an-an-1

发现后面是不变的值,那么我们只需要根据b的变化改变 a1+k 就好了

注意实现的时候qq初始设为0,这样n==1时,我们就不用特判了。

如果qq初始设为a[2]-a[1]的话,n==1时,不存在该值,会出错。

const int N=2e6+7;
int n,m;
ll a[N],b[N];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        scanf("%lld",&a[i]);
    }
    for(int i=1;i<=m;++i){
        scanf("%lld",&b[i]);
    }
    sort(a+1,a+1+n);
    ll qq=0;
    for(int i=2;i<=n;++i)
        qq=__gcd(qq,a[i]-a[i-1]);
    for(int i=1;i<=m;++i){
        ll ans=__gcd(a[1]+b[i],qq);
        printf("%lld ",ans);
    }
    return 0;
}

------------

周五的CF打完以后晚上没睡着,把英语课旷了,唉。

原文地址:https://www.cnblogs.com/PdrEam/p/14164079.html