简单题,跑一遍二分图即可.
const ll N=1e5+5;
ll head[N], to[N<<1], next[N<<1], tot;
inline void add(ll x, ll y){
to[++tot]=y; next[tot]=head[x]; head[x]=tot;
}
inline void Link(ll x, ll y){
add(x, y); add(y, x);
}
ll n, m;
ll col[N];
ll deg[N];
inline bool dfs(ll x, ll c){
col[x]=c;
for (R ll i=head[x], ver; i; i=next[i]){
ver=to[i];
if (!col[ver] && !dfs(ver, 3-c)) return false;
else if (col[ver]==c) return false;
}
return true;
}
ll res1, res2;
int main(){
read(n); read(m);
for (R ll i=1, x, y; i<=m; i++){
read(x); read(y); Link(x, y);
++deg[x]; ++deg[y];
}
for (R ll i=1; i<=n; i++){
if (deg[i] && !col[i])
if (!dfs(i, 1)) return puts("-1"), 0;
if (col[i]==1) ++res1;
if (col[i]==2) ++res2;
}
writeln(res1);
for (R ll i=1; i<=n; i++){
if (col[i]==1) writesp(i);
}putchar('\n');
writeln(res2);
for (R ll i=1; i<=n; i++){
if (col[i]==2) writesp(i);
}putchar('\n');
}
先用欧拉筛筛出 [ 1 , 1000000 ] [1, 1000000] [1,1000000]内的所有素数,然后将 k k k进行质因数分解.不难看出 k k k质因子个数至多有 log k \log k logk个,然后对每个 c i c_i ci分解质因数看能否完全覆盖掉 k k k的某个质因子即可.
写复杂了,其实可以直接搞整除。
复杂度
O
(
n
l
o
g
k
)
\mathcal{O(nlogk)}
O(nlogk)
const ll N=1e6+6;
ll prime[N], sum;
bool book[N];
inline void euler_solve(ll lim){
for (R ll i=2; i<=lim; i++){
if (!book[i]) prime[++sum]=i;
for (R ll j=1; i*prime[j]<=lim; j++){
book[i*prime[j]]=true;
if (i%prime[j]==0) break;
}
}
}
ll c1[N], c2[N], cnt;
ll n, k;
bool tag[N];
int main(){
euler_solve(1000000);
read(n); read(k);
for (R ll i=1; prime[i]*prime[i]<=k; i++){
if (k%prime[i]==0){
c1[++cnt]=prime[i];
while (k%prime[i]==0) k/=prime[i], ++c2[cnt];
}
}
if (k>1) c1[++cnt]=k, ++c2[cnt];
for (R ll i=1, x; i<=n; i++){
read(x);
for (R ll j=1; j<=cnt; j++){
if (tag[j]) continue;
ll tmp=0;
while (x%c1[j]==0) x/=c1[j], ++tmp;
if (tmp>=c2[j]) tag[j]=true;
}
}
for (R ll i=1; i<=cnt; i++)
if (!tag[i]) return puts("No"), 0;
return puts("Yes"), 0;
CF687C The Values You Can Make
D P \mathcal{DP} DP
先设计状态: f [ i ] [ j ] f[i][j] f[i][j]表示 i , j i,j i,j能否同时在背包中取到.然后柳暗花明.
const ll N=5e2+2;
ll n, K;
ll c[N];
bool f[N][N];
ll res;
int main(){
read(n); read(K);
for (R ll i=1; i<=n; i++) read(c[i]);
sort(c+1, c+n+1);
f[0][0]=true;
for (R ll i=1; i<=n; i++)
for (R ll j=K; j>=0; j--)
for (R ll k=K; k>=0; k--){
if (j>=c[i]) f[j][k]|=f[j-c[i]][k];
if (k>=c[i]) f[j][k]|=f[j][k-c[i]];
}
for (R ll i=0; i<=K; i++) if (f[i][K-i]) ++res;
writeln(res);
for (R ll i=0; i<=K; i++)
if (f[i][K-i]) writesp(i);
putchar('\n');
}