这道题目晚上本来就花了很多把都××了,着实觉得自己思路没错啊,回顾一下思路,给你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