885 div2 c

#include 
using namespace std;
typedef long long ll;
typedef pair PII;
typedef pair PDD;
typedef vector VI;
const int mod = 1e8;
using ull = unsigned long long;
//int res = 0x3f3f3f3f;
void solve(){
    int n;
    cin>>n;
    VI a(n+1),b(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    int t = -1;
    for(int i=1;i<=n;i++){
        int x = a[i],y = b[i];
        if(a[i] == 0 && b[i] == 0) continue;
        int step = 0;
        while(x){
            if(y > 2*x) y = y % (2 * x);
            int tmp = x;
            x = y;
            y = abs(tmp-y);
            step++;
        }
        if(t != -1 && step % 3 != t){
            puts("NO");
            return;
        }
        t = step % 3;

    }
    puts("YES");



}

int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }

}

考虑到果如 y > 2x 那么经过三次变化  就可以变成 y - 2x   x

如 100 1  99  98 1,因此对y取2x的模

因为   0 1 1 0  同一个0直接要差距三次变换,所以每组数组都要同余3

你可能感兴趣的:(思维构造,算法,c++,数据结构)