CodeForces 449C Jzzhu and Apples 数学+素数

来源:互联网 发布:原子能实验室玩具知乎 编辑:程序博客网 时间:2024/04/28 00:20

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





0 0
原创粉丝点击