同写着自己看

B,Basic Gcd Problem

我贴一下题目吧,当时我一看这一场这些题目,我还以为我要爆零了

图片说明
这个式子看起来很牛比,但是实际上理解之后就明白了,这个题目一看就是要找最大的gcd,那怎么找呢,一个数很容易就能想到和比自己小的数里面gcd最大的就是自己最大的因数,因为gcd得到的一定是那个数的因数,所以最大的就是那个数最大的因数,然后又对那个对大的因数找最大的因数,最后会找到1,每找一次就乘以一个c,所以答案就是找了多少次就是c的几次方

然后就是我自己做的时候,我第一次做的时候是采用的顺推,就是每输入一个数就找一次,最后不负众望的超时了,所以我后来就改成先预处理好,然后直接输出就好了

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll n=1e6+5;
const ll mod=1e9+7;
ll is_prime[n];
ll qpow(ll a, ll b) {
    ll ans = 1;
    while (b) {
        if (b & 1) ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
int cao(int x){
    int n = sqrt(x)+3;
    for(int i = 2 ; i <= n ; ++i)
        if(x % i == 0) return x/i;
    return 1;
}
int main (void){
    int T;
    for(int i = 2 ; i <= n ; ++i) 
        is_prime[i] = is_prime[cao(i)]+1;
    scanf("%d",&T);
    while(T--){
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%lld\n",qpow(b,is_prime[a])%mod);
    }
    return 0;
}

F,Finding the Order

这个题目才是真的签到题,告诉你两个线上四个点的距离,然后去推测c在前面还是d在前面,没啥好说的

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll n=1e6+5;
const ll mod=1e9+7;
int main(void){
    int T;
    scanf("%d",&T);
    while(T--){
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        int cnt;
        cnt=max(max(a,b),max(c,d));
        if(cnt==c||cnt==b)
            printf("AB//CD\n");
        else
            printf("AB//DC\n"); 
    }
    return 0;
}