这道题目晚上本来就花了很多把都××了,着实觉得自己思路没错啊,回顾一下思路,给你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;
}
CodeForces 449C Jzzhu and Apples 数学+素数,布布扣,bubuko.com
CodeForces 449C Jzzhu and Apples 数学+素数
原文地址:http://blog.csdn.net/yitiaodacaidog/article/details/37996833