A题简单的模拟计算,注意上取整的实现。
B题计算每个房间对应的每个最迟时间点,在这些时间点最取最小值,保证能安全通过所有房间。
D题拿到手就可以发现是贪心,但发现两部分会有冲突,也就是重复计算的部分。故提前找到两个数的lcm然后不计算lcm的倍数,为其他参与计算的数安排剩余数种的最大值和最小值,最后需要推导一一下等差数列求和
C题是构造题,需要给出一种构造使得两个非互质数相加在目标区间,我的思路有些单一化,确定了以2为gcd来进行构造,导致需要考虑细分的情况很多,写的也很琐碎,还用到了线性筛,以及深刻体会到了能用数组就不用map,被卡死了,难受(。
大致说一下我的思路:
- 首先要找到4这个分界点,因为4能被分解2和2,这是可以给出的最小非质对了。
- 对于大于4的左边界L,我们看右边界R是不是和L重合,若不重合,则区间内一定能找到大于4的偶数sum,将其分解成4,和sum-4,他们起码有gcd是2。
- 如果重合,则这个数是偶数和刚刚一样处理即可。
- 若是奇数,我们看它是不是质数,根据数论我们可以找到如果是质数的话一定是无解的。
- 如果不是质数,则我们找到它的最小质因子f,分解成f和sum-f。
以上是我的思路,为了保证时间效率,我提前用线性筛预处理范围内所有的质数和非质数的最小质因子,结果发现好像每次都处理也能来及,而且似乎时间还快了,我的是\(O(n)\),每次现场处里\(O(T*\sqrt{n})\)。
// Problem: C. Non-coprime Split
// Contest: Codeforces - Codeforces Round 895 (Div. 3)
// URL: https://codeforces.com/contest/1872/problem/C
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
//# define int long long
#define ull unsigned long long
#define pii pair<int,int>
#define double long double
#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl "\n"
const int N = 1e7;
const int M = 1e7+ 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
int n, m;
bool st[N];
int mp[N];
void pre(){
for(int i=2;i<=N;i++){
if(st[i])continue;
else{
for(int j=2*i;j<=N;j+=i){
st[j]=true;
mp[j]=i;
}
}
}
}
// void ans(){
// for (int i = 2; i <= N; i ++ )
// {
// if (!st[i]) primes[cnt ++ ] = i;
// for (int j = 0; primes[j] <= N / i; j ++ )
// {
// st[primes[j] * i] = true;
// mp[primes[j] * i]= primes[j];
// if (i % primes[j] == 0) {
//
// break;
// }
//
// }
// }
// }
void solve(){
int l,r;
cin>>l>>r;
if(r<=3){cout<<-1<<endl;return;}
if(l<=4&&r>=4){cout<<2<<" "<<2<<endl;return ;}
if(l!=r){
if(l%2==0){cout<<4<<' '<<l-4<<endl;return ;}
else {
cout<<4<<' '<<l-3<<endl;return ;
}
}
else {
if(l%2==0){cout<<4<<' '<<l-4<<endl;return ;}
else {
if(st[l]==false){
cout<<-1<<endl;return;
}
else {
int f=mp[l];
cout<<f<<" "<<l-f<<endl;
return ;
}
}
}
}
int main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
pre();
while (t--) {
solve();
}
return 0;
}
这样思考时间花费太多,如果直接暴力枚举区间内的数,并且在线分解也是可以的。
标签:895,质数,Codeforces,long,Div,sum,define From: https://www.cnblogs.com/mathiter/p/17739250.html