首页 > 代码库 > CodeForces 449C Jzzhu and Apples 数学+素数

CodeForces 449C Jzzhu and Apples 数学+素数

这道题目晚上本来就花了很多把都××了,着实觉得自己思路没错啊,回顾一下思路,给你n个数,分成两两组合一对,分成最多组如何分,但是组合的两个数 不能互素,所以呢 偶数肯定是好的了,所以先放着,先把素数给搞定,10^5所以枚举所有包含该素数因子的数,如果刚好分组则最好,不然的话其中有偶数的踢掉一个给下面的偶数处理部分,最后再处理偶数的部分,这样肯定满足组数最多,完全没有问题,后来方法确实是没问题啊,只是代码有问题,我靠!真是脑残!,今天看到一位大牛的想法,我跟他是一样的,只是代码写搓了,后来改了又改过了,但是原本的代码真的是不能看啊,唉写的太繁琐,还是用STL方便点,10^5即使耗时点也无妨,于是敲了一把STL的,当然敲了好几次才解决错误,真弱|!清晰简洁,还不易出错,又是长记性的好题目,


题目:http://codeforces.com/problemset/problem/449/C

推荐一个本场的大牛的题解:http://blog.csdn.net/houserabbit/article/details/37992617


#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>

#define ll long long

#define eps 1e-8

//const int inf = 0xfffffff;

const ll inf = 1ll<<61;

using namespace std;

//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;


bool isprime[100000 + 5];
int prime[100000 + 5];
int k;

void init()
{
	memset(isprime,false,sizeof(isprime));
	for(int i=2;i<100005;i++)
		if(!isprime[i])
			for(int j=i*2;j<100005;j+=i)
				isprime[j]=true;
	for(int i=2;i<100005;i++)
		if(!isprime[i])
			prime[k++]=i;
}

int n;

vector<pair<int ,int> > G;

void clear() {
	memset(isprime,false,sizeof(isprime));
	G.clear();
}

int main() {
	init();
	while(scanf("%d",&n) == 1) {
		clear();
		int ans = 0;
		vector<int > tmp;
		vector<int > ::iterator it;
		for(int i=1;i<k;i++) {
			if(prime[i] > n)break;
			tmp.clear();
			for(int j=prime[i];j<=n;j+=prime[i])
				if(!isprime[j])
					tmp.push_back(j);
			int len = tmp.size();
			if(len == 1)continue;
			if(len&1) {
				for(it = tmp.begin();it != tmp.end();it++)
					if(*it%2 == 0) {
						tmp.erase(it);break;
					}
			}
			len = tmp.size();
			for(int i=0;i<len;i+=2) {
				ans++;
				isprime[ tmp[i] ]= true;
				isprime[ tmp[i + 1] ] = true;
				G.push_back(make_pair(tmp[i],tmp[i + 1]));
			}
		}
		int tp = -1;
		for(int i=2;i<=n;i+=2) {
			if(!isprime[i]) {
				if(tp != -1) {
					ans++;
					isprime[i] = true;
					isprime[tp] = true;
					G.push_back(make_pair(tp,i));
					tp = -1;
				}
				else tp = i;
			}
		}
		printf("%d\n",ans);
		for(int i=0;i<ans;i++)
			printf("%d %d\n",G[i].first,G[i].second);
	}
	return 0;
}