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;
}

                
            
浙公网安备 33010602011771号