A Orac and Factors standard input/output 2 s, 256 MB Submit Add to favourites x13533
k = 1时,n += d(n), k > 1时, n += 2, 因为第一步加了以后n肯定变成了一个偶数 O(log n)
B Orac and Models standard input/output 3 s, 256 MB Submit Add to favourites x8248
直接进行枚举, 用dp 记录, i 1-n 遍历每个数字的倍数 O(n*sqrt(n))
C Orac and LCM standard input/output 3 s, 256 MB Submit Add to favourites x5159
个人感觉这题比D题难多了, 结论 pk ∣ ans , 当且仅当:对于 i=1,2,3,...,ni=1,2,3,...,n ,有至少 n-1n−1 个 ii 满足 p^k | ai (证明没看懂),就是说 ans 的每个质因子 至少有n-1的数可以整除
然后两种做法,
1、对于 ai , 产生的 lcm 为 lcm(ai , ai+1) , lcm(ai , ai+2) ... lcm(ai , an)
产生的 gcd_i 为 gcd ( lcm(ai , ai+1) , lcm(ai , ai+2) ... lcm(ai , an) )
因为参与 gcd_i 的每一项都是 ai 的倍数 (传送门)
所以 gcd( lcm(ai , ai+1) , lcm(ai , ai+2) ... lcm(ai , an) ) 可以化为 lcm (ai , gcd (ai+1 , ai+2 , ... an) )
那么最后答案就为 ans = gcd( gcd_1 , gcd_2 , ... gcd_n ) , 我们用一个后缀数组就可以了
2、分解每个数的质因子 求出每个质因子的 n-1 个数满足的最小情况
具体做法是把每个数的质因子的幂次压入数组 数组排序后取第n-1小的元素累乘就是答案
3、因为至少n-1个数能整除, 把ai 每个数都去除一次组成的n-1个元素数组的gcd算一下, 然后把这个n个gcd值求下 lcm 即可
快速求n-1个元素 数组的gcd 可以用前缀数组和后缀数组简化 例如求除去ai的 n-1个元素数组gcd = gcd(gcd(a1,a2,....,ai-1), gcd(ai+1, ai+2....an));
D Orac and Medians standard input/output 2 s, 256 MB Submit Add to favourites x2005
如果数组中不存在k, 那么很明显无法成功, 当数组中存在k时, 只需要存在连续的三个数 其中有两个数大于等于k 则必有解
假设三个数为 k k+1 k-1 或者 k+1 k+1 k 或者 k k x 那么显而易见可以变成 k k k 然后就可以自由扩散将别的数字变成 k,
假设三个数为 k+1 k+1 k-1 那么显而易见可以变成 k+1 k+1 k+1 然后就可以自由扩散将别的数字变成 k+1, 直到遇见数字 k 时, 再将其他数字变成 k 。。。
其他情况大致如此, 故遍历一遍看是否有 k 存在 且 连续三个数 两个数满足大于等于 k 即可, O(n)
#include <bits/stdc++.h> using namespace std; #define ll long long #define _for(i,a,b) for(int i = (a); i < (b); i++) #define _rep(i,a,b) for(int i = (a); i <= (b); i++)
void taskA1() { int t; cin >> t; while(t--) { int n,k; cin >> n >> k; int q = sqrt(n), x = n; _rep(i,2,q) if(n%i == 0) { x = i; break;} n = n+x+(k-1)*2; cout << n << " "; } return; }
void taskB1() { int t; cin >> t; while(t--) { int n; cin >> n; vector<int> a(n+1), f(n+1, 1); _rep(i,1,n) cin >> a[i]; _rep(i,1,n) for(int j = 2*i; j <= n; j+=i) { if(a[i] < a[j]) f[j] = max(f[j], f[i]+1); } int ans = 0; _rep(i,1,n) ans = max(ans, f[i]); cout << ans << " "; } return; }
void taskB1() { int t; cin >> t; while(t--) { int n; cin >> n; vector<int> a(n+1, 0), f(n+1,1); _rep(i,1,n) cin >> a[i]; int ans = 1; _rep(i,1,n) { int q = sqrt(i); _rep(j,1,q) { if(i%j==0) { if(a[j] < a[i]) f[i] = max(f[i], f[j]+1); if(a[i/j] < a[i]) f[i] = max(f[i], f[i/j]+1); } } } _rep(i,1,n) ans = max(ans, f[i]); cout << ans << " "; } return; }
int gcd(int a, int b) { return !b? a : gcd(b, a%b);} int lcm(int a, int b) { return a*b/gcd(a,b);} void taskC11() { int n; cin >> n; vector<int> a(n+1), suf(n+1, 0); _rep(i,1,n) cin >> a[i]; for(int i = n; i > 0; i--) suf[i] = gcd(suf[i+1], a[i]); int ans = 0; _rep(i,1,n) ans = gcd(ans, lcm(a[i], suf[i+1])); cout << ans << " "; return; }
ll fpow(ll a, ll b) { ll ret = 1; while(b) { if(b & 1) ret = ret*a; b >>= 1; a *= a; } return ret; } const int N = 2e5+10; int prime[N],vis[N],cnt; vector<int> g[N]; void init(int n) { _rep(i,2,n) { if(!vis[i]) prime[++cnt] = i, vis[i] = i; for(int j = 1; j <= cnt and i*prime[j] <= n; j++) { vis[prime[j]*i] = prime[j]; if(i%prime[j] == 0) break; } } return; } void taskC12() { int n; cin >> n; init(N-10); vector<int> a(n); _for(i,0,n) cin >> a[i]; /* _for(i,0,n) { int x1 = a[i]; _rep(j,2,a[i]) { if(j*j > a[i]) break; if(x1%j == 0) { int x2 = 0; while(x1%j == 0) x1 /= j, x2++; g[j].push_back(x2); } }if(x1 > 1) g[x1].push_back(1); } */ _for(i,0,n) { int y = a[i]; _rep(j,1,a[i]) // a { int x = prime[j]; if(x*x > y) break; if(y%x == 0) { int c = 0; while(y%x == 0) y /= x, c++; g[x].push_back(c); } } if(y > 1) g[y].push_back(1); } ll ans = 1; _rep(i,1,cnt) { int x = prime[i]; if(g[x].empty()) continue; sort(all(g[x])); if(g[x].size() == n) ans *= fpow(x, g[x][1]); else if(g[x].size() == n-1) ans *= fpow(x, g[x][0]); } cout << ans << " "; return; }
void taskC1() { taskC12(); // soultion 2 //taskC11(); // soultion 1 return; }
void taskD1() { int t; cin >> t; while(t--) { int n,k; cin >> n >> k; vector<int> a(n); int f1 = 0; _for(i,0,n) cin >> a[i], f1 |= (a[i]==k); if(!f1) { cout << "no "; continue; } if(n==1) { cout << "yes "; continue; } _for(i,0,n) { if(a[i] == k) a[i] = 1; else if(a[i] > k) a[i] = 2; else a[i] = 0; } int f = 0; _for(i,0,n) { if(i < n-1 and a[i] && a[i+1]) f = 1; if(i < n-2 and a[i] && a[i+2]) f = 1; } cout << (f?"yes ":"no "); } return; }
int main(){ ios::sync_with_stdio(false), cin.tie(nullptr); //taskA1(); //cf641div2 //taskB1(); //taskC1(); taskD1(); return 0; }