『CF687X』

CF687A NP-Hard Problem

简单题,跑一遍二分图即可.

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');
}

CF687B Remainders Game

先用欧拉筛筛出 [ 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');
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值