acwing 周赛21

整数幂


思路:判断b是不是a的n次方,在b%a=0条件下,只需要一直b/a,如果是n次幂,那么b/a最后结果就是a/a=1

代码:

# include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main(){
    ll n,l,k;
    cin >> n;
    while (n --){
        cin >> k;
        cin >> l;
       while(l % k == 0){
           l /= k;
       }
        if (l == 1) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

变成1


思路:二进制尾数是1,是奇数,加一,逢二进一,二进制尾数是0,除二,对于字符串,长度减一
注意:题目保证首位是1,假设数是11,代码操作加1后是00,实际是10,还要除二

#include <iostream>
#include <map>
#include <vector>
#include <utility>
#include <algorithm>
#include <cmath> 
#include <string>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 1e6 + 10;

typedef long long ll;

int main(){
    string s;
    cin >> s;
    ll cnt = 0;
    ll n;
    cin >> s;
    n = s.length() - 1;
    while (n){
        cnt ++;
        if (s[n] == '0') n --;
        else {
            for (int i = n; i >= 0; i --){
                if (s[i] - '0' + 1 > 1) s[i] = '0';
                else {
                    s[i] = '1';
                    break;
                }
            }
        }
    }
    if (s[n] == '0') cnt ++;
    cout << cnt;
    return 0;
}

最大公约数


思路:

代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
 
typedef long long ll;

ll gcd(ll a, ll b){
    return b ? gcd(b,a%b) : a;
}

ll phi( ll n){
    ll res = n;
    for (int i = 2; i <= n/i; i ++ ){
        if (n % i == 0){
            while(n % i == 0) n /= i;
            res = res / i * (i - 1);
        }
    }
    if (n > 1) res = res / n * (n - 1);
    return res;
}

int main(){
    ll t,a,m;
    cin >> t;
    while(t --){
        cin >> a >> m;
        ll x = gcd(a,m);
        ll m1 = m / x;
        cout << phi(m1) << endl;
    }
    return 0;
}
posted @ 2021-10-17 18:45  Gsding  阅读(28)  评论(0)    收藏  举报