Codeforces Round #766 C-D
D. Not Adding
正着显然不好做
我们观察数据范围 ai 居然是小于1e6的
我们考虑反想 看一个数如何才能被得到
我们设他能被gcd(a,b)得到 那么a,b一定是得是这个数的倍数
并且其前面的系数的gcd只能是1
这样答案就呼之欲出了
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
void solve() {
int n;cin>>n;
vector<int>vis(N);
for(int i=1;i<=n;i++){
int x;cin>>x;
vis[x]=1;
}
int cnt=0;
for(int i=1;i<=N-10;i++){
if(vis[i])continue;
int res=0;
for(int j=i*2;j<=N-10;j+=i)
if(vis[j])res=__gcd(res,j/i);
if(res==1)vis[i]=1,cnt++;
}
cout<<cnt<<endl;
}
signed main(){
fast
int T;T=1;
while(T--) {
solve();
}
return ~~(0^_^0);
}
C. Not Assigning
因为素数除了2之外都是奇数
而奇数刚刚好 和奇数相加是一定不是素数
所以我们中间一定要是2相连 再穿插其他数
我们考虑多个节点 发现要是有两个2的话显然不可以的
所以我们认定答案只是一条链
并且一定要用2穿插其他素数 因为只是一条链 我们232323这样即可
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
void solve() {
int n;cin>>n;
vector<int>vis(N);
for(int i=1;i<=n;i++){
int x;cin>>x;
vis[x]=1;
}
int cnt=0;
for(int i=1;i<=N-10;i++){
if(vis[i])continue;
int res=0;
for(int j=i*2;j<=N-10;j+=i)
if(vis[j])res=__gcd(res,j/i);
if(res==1)vis[i]=1,cnt++;
}
cout<<cnt<<endl;
}
signed main(){
fast
int T;T=1;
while(T--) {
solve();
}
return ~~(0^_^0);
}

浙公网安备 33010602011771号