EOJ——Problem #3291——素数个数排序

素数个数排序

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;
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值