素数个数排序
Time limit per test: 1.0 seconds
Memory limit: 256 megabytes
设p(x, y)表示x到y之间的素数个数(包括x和y本身)。给你n组x,y,把它们按p(x, y)从小到大排序,若p(x, y)相等,则按x从小到大排序,若p(x, y)和x都相等,则按y从小到大排序。
Input
第1行为一个整数T(1≤T≤15)为问题数。
以后T个问题,每个问题第一行为一个整数n(0<n<10000),之后n行每行两个用一个空格隔开的正整数x, y(x<y<=10000)。
Output
对于每个问题,输出一行问题的编号(0开始编号,格式:case #0: 等)
然后输出n行,为排序之后的数据。
Examples
Input
3 3 1 10 3 12 1 12 3 2 17 2 18 2 16 1 2 3
Output
case #0: 1 10 3 12 1 12 case #1: 2 16 2 17 2 18 case #2: 2 3 先打个表,再来求值,然后排序、#include<cstdio> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<string> #include<cstring> #include<cmath> using namespace std; struct AP { int x; int y; int com; } a[10008]; bool compare(AP a,AP b) { if(a.com!=b.com) return a.com<b.com; else if(a.x!=b.x) return a.x<b.x; else return a.y<b.y; } int main() { vector<int>vec1; for(int i=2; i<=10010; i++) { vector<int>::iterator it; int flag=1; for(it=vec1.begin(); it!=vec1.end()&&(*it)<=sqrt(i); it++) if(i%(*it)==0) { flag=0; break; } if(flag) vec1.push_back(i); } int N,temp=0; cin>>N; while(N--) { printf("case #%d:\n",temp++); int n; cin>>n; for(int i=0; i<n; i++) { cin>>a[i].x>>a[i].y; vector<int>::iterator it1,it2; it1=lower_bound(vec1.begin(),vec1.end(),a[i].x); it2=upper_bound(vec1.begin(),vec1.end(),a[i].y); a[i].com=it2-it1; } sort(a,a+n,compare); for(int i=0; i<n; i++) cout<<a[i].x<<' '<<a[i].y<<endl; } return 0; }