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号