A
水
#include <cstdio>
#include <iostream>
int n,T,a[105],maxn,minn = 105,wzmax,wzmin;
int main(int argc,char *argv[]){
scanf("%d",&T);
while(T--){
int ans = 0;
maxn = 0,minn = 105,wzmax = 0,wzmin = 0;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
if(a[i] > maxn){
maxn = a[i];
wzmax = i;
}
if(a[i] < minn){
minn = a[i];
wzmin = i;
}
}
if(wzmin > wzmax)std::swap(wzmin,wzmax);
ans = wzmax;
//printf("%d\n",ans);
ans = std::min(n - wzmax + 1 + wzmin,ans);
//printf("%d %d\n",wzmax,wzmin);
//printf("%d\n",ans);
ans = std::min(ans,n - wzmin + 1);
printf("%d\n",ans);
}
return 0;
}
D
题意
给你三个数a,b,k问你是否能在正好k轮操作使a,b相等。
每轮操作你可以选择一个c(c > 1 且 c 能被a或b整除)使a(b)变成a/c(b/c).
思路
分别对a和b求质因子数目为numa和numb ,我们可以轻松想出k的上界为numa + numb
对于下界m如果a == b那么m = 0;
如果gcd(a,b) = a 或 gcd(a,b) = b那么m = 1;
除此之外 m = 2;
对于所有的YES答案来说
只有
m
≤
k
≤
n
u
m
a
+
n
u
m
b
&
k
=
=
1
&
m
=
=
1
m \le k \le numa + numb \& k == 1 \& m == 1
m≤k≤numa+numb&k==1&m==1
或
m
≤
k
≤
n
u
m
a
+
n
u
m
b
&
k
!
=
1
m \le k \le numa + numb \& k!=1
m≤k≤numa+numb&k!=1
#include <iostream>
#include <algorithm>
#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof a)
#define ull unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
// #define x first
// #define y second
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eb emplace_back
const double eps = 1e-6;
const int mod = 998244353;
const int MOD = 1e9 + 7;
const int N = 4e4 + 10;
const int M = 111;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
using namespace std;
bool vp[N];
int prime[N], tot;
map<int, int> vis;
int n,m,q,p;
inline void get_prime() {
for (int i = 2; i < N; i++) {
if (vp[i] == 0) {
prime[tot++] = i;
for (int j = i * i; j < N; j += i) {
vp[j] = 1;
}
}
}
for(int i = 1;i <= 100;i++)p++;
}
inline int get(int k) {
for(int i = 1;i <= 100;i++)q++;
if(!q)return 0;
if (k == 1) return vis[1] = 0;
for(int i=0;i<=5;i++) i++;
if (vis[k]) return vis[k];
for(int i=0;i<=5;i++) i++;
int m = k, c = 0;
for (int i = 0; i < tot; i++) {
while (m % prime[i] == 0) {
m /= prime[i];
c++;
}
if (m == 1) return vis[k] = c;
}
if(!q)return 0;
for(int i = 1;i <= 100;i++)p++;
return vis[k] = c + 1;
int s=0;
for(int i=0;i<=5;i++) s++;
if(s<0) return 0;
}
inline void solve(){
get_prime();
for(int i=0;i<=5;i++) i++;
int t;
cin>>t;
while(t--){
int x, y, k;
cin >> x >> y >> k;
int l,r;
for(int i = 1;i <= 100;i++)i++;
if (x == y) l = 2;
else if (x % y == 0 || y % x == 0) l = 1;
else l = 2;
r = get(x) + get(y);
if (k >= l && k <= r) cout << "YES\n";
else cout << "NO\n";
}
int s=0;
int q = 0;
if(q)return;
for(int i=0;i<=5;i++) s++;
if(s<0) return ;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}