ZJCOJ: L先生与质数V4(数论)

Problem L: L先生与质数V4(应各位菊苣要求)

Time Limit: 1 Sec   Memory Limit: 16 MB
Submit: 313   Solved: 71
[ Submit][ Status][ Web Board]

Description

在解决了上一个质数问题之后,L先生依然不甘心,他还想计算下更多范围内的质数,你能帮助他吗?(没错这题题面和V3一毛一样)

Input

有多组测试例。(测试例数量<70)
每个测试例一行,输入一个数字n(0<n<=3000000),输入0表示结束。

Output

输出测试例编号和第N个质数。
Case X: Y

Sample Input

1
2
3
4
10
100
0

Sample Output

Case 1: 2
Case 2: 3
Case 3: 5
Case 4: 7
Case 5: 29
Case 6: 541

思路:直接打表肯定超时,考虑分段打表,先离线搞搞,分若干个区间,找出n所在的区间,再从中筛出素数即可。

记下代码,以后再继续优化。

# include <bits/stdc++.h>
using namespace std;

const int maxn = 5e7;
int p[10000]={0};
int l[333] = {10000,20000,30000,40000,50000,60000,70000,80000,90000,100000,110000,120000,130000,140000,150000,160000,170000,180000,190000,200000,210000,220000,230000,240000,250000,260000,270000,280000,290000,300000,310000,320000,330000,340000,350000,360000,370000,380000,390000,400000,410000,420000,430000,440000,450000,460000,470000,480000,490000,500000,510000,520000,530000,540000,550000,560000,570000,580000,590000,600000,610000,620000,630000,640000,650000,660000,670000,680000,690000,700000,710000,720000,730000,740000,750000,760000,770000,780000,790000,800000,810000,820000,830000,840000,850000,860000,870000,880000,890000,900000,910000,920000,930000,940000,950000,960000,970000,980000,990000,1000000,1010000,1020000,1030000,1040000,1050000,1060000,1070000,1080000,1090000,1100000,1110000,1120000,1130000,1140000,1150000,1160000,1170000,1180000,1190000,1200000,1210000,1220000,1230000,1240000,1250000,1260000,1270000,1280000,1290000,1300000,1310000,1320000,1330000,1340000,1350000,1360000,1370000,1380000,1390000,1400000,1410000,1420000,1430000,1440000,1450000,1460000,1470000,1480000,1490000,1500000,1510000,1520000,1530000,1540000,1550000,1560000,1570000,1580000,1590000,1600000,1610000,1620000,1630000,1640000,1650000,1660000,1670000,1680000,1690000,1700000,1710000,1720000,1730000,1740000,1750000,1760000,1770000,1780000,1790000,1800000,1810000,1820000,1830000,1840000,1850000,1860000,1870000,1880000,1890000,1900000,1910000,1920000,1930000,1940000,1950000,1960000,1970000,1980000,1990000,2000000,2010000,2020000,2030000,2040000,2050000,2060000,2070000,2080000,2090000,2100000,2110000,2120000,2130000,2140000,2150000,2160000,2170000,2180000,2190000,2200000,2210000,2220000,2230000,2240000,2250000,2260000,2270000,2280000,2290000,2300000,2310000,2320000,2330000,2340000,2350000,2360000,2370000,2380000,2390000,2400000,2410000,2420000,2430000,2440000,2450000,2460000,2470000,2480000,2490000,2500000,2510000,2520000,2530000,2540000,2550000,2560000,2570000,2580000,2590000,2600000,2610000,2620000,2630000,2640000,2650000,2660000,2670000,2680000,2690000,2700000,2710000,2720000,2730000,2740000,2750000,2760000,2770000,2780000,2790000,2800000,2810000,2820000,2830000,2840000,2850000,2860000,2870000,2880000,2890000,2900000,2910000,2920000,2930000,2940000,2950000,2960000,2970000,2980000,2990000,3000000};
int r[333] = {104729,224737,350377,479909,611953,746773,882377,1020379,1159523,1299709,1441049,1583539,1726943,1870667,2015177,2160553,2307229,2454587,2601857,2750159,2898527,3047767,3196933,3346601,3497861,3648923,3800201,3951161,4103629,4256233,4410317,4562693,4716053,4869863,5023307,5178049,5332519,5487701,5644031,5800079,5955031,6111613,6268289,6424937,6581963,6738889,6895393,7052113,7210759,7368787,7528121,7685801,7844731,8003537,8163047,8322241,8482259,8640679,8799919,8960453,9121439,9281011,9442229,9602443,9763393,9925439,10086767,10248899,10410139,10570841,10732003,10894817,11056729,11218439,11381621,11543549,11705891,11869021,12031867,12195257,12358069,12521009,12684713,12847433,13012261,13177433,13341187,13506011,13669741,13834103,13998679,14163143,14328269,14492237,14657917,14822231,14988613,15153847,15318907,15485863,15650303,15816469,15981557,16147561,16313527,16480501,16646677,16812361,16977973,17144489,17311727,17477423,17643037,17810803,17977291,18145249,18312037,18480347,18647243,18815231,18982883,19150577,19318703,19485533,19654991,19822093,19989791,20158049,20326759,20495843,20664361,20832433,21000853,21169831,21338609,21506941,21675881,21844297,22012453,22182343,22353031,22522919,22691443,22860683,23029399,23199721,23368379,23538737,23708479,23879519,24048797,24218651,24387893,24557887,24727249,24898427,25069267,25241299,25411777,25582153,25752917,25923059,26093519,26265469,26434907,26605609,26777507,26948063,27118249,27290279,27461653,27632113,27803969,27974867,28146689,28317637,28490171,28660867,28833901,29005541,29178257,29349643,29522497,29693977,29866219,30036287,30207979,30379903,30552593,30723761,30895807,31070219,31243013,31415641,31589027,31762387,31934521,32107171,32280191,32452843,32625209,32798153,32970967,33145117,33317371,33489689,33663871,33836479,34010831,34186049,34361009,34534007,34709251,34882457,35056607,35230241,35403397,35577769,35751311,35926307,36099559,36273761,36447503,36621419,36796379,36971861,37143913,37319687,37493747,37667659,37842263,38017867,38190907,38365139,38539471,38714369,38887747,39063091,39237481,39410867,39585587,39759641,39935213,40111087,40285789,40460741,40637147,40810697,40986793,41161739,41337427,41513261,41690101,41864377,42042061,42216827,42391303,42567113,42743089,42920191,43095979,43272461,43447373,43623149,43800299,43975717,44152781,44328307,44504843,44680319,44856223,45032437,45208589,45382451,45558553,45734873,45910519,46086977,46264321,46441207,46617629,46793869,46970699,47147459,47323781,47500631,47678909,47855287,48032629,48210713,48387587,48565117,48742583,48919771,49096849,49273369,49449973,49625413,49803113,49979687};
int a[190000];
void init()
{
    int imaxn = sqrt(maxn)+1;
    for(int i=2; i<=imaxn; ++i)
    {
        if(!p[i])
            p[++p[0]] = i;
        for(int j=1; j<=p[0]&&i*p[j]<=imaxn; ++j)
        {
            p[i*p[j]] = 1;
            if(i % p[j] == 0)
                break;
        }
    }
}
int main()
{
    init();
    int n,cas=1, ans;
    while(~scanf("%d",&n) && n)
    {
        memset(a, 0, sizeof(a));
        int rb = lower_bound(l, l+301, n)-l;
        if(l[rb] == n)
        {
            printf("Case %d: %d\n",cas++, r[rb]);
            continue;
        }
        int lb = rb==0?2:r[rb-1]+1;
        if(rb > 0) n -= l[rb-1];
        rb = r[rb];
        for(int i=1; i<=p[0]; ++i)//区间左移。
        {
            int x = (lb-1)/p[i] + 1;
            int y = rb/p[i];
            for(int j=x; j<=y; ++j)
                if(j>1)
                    a[j*p[i]-lb] = 1;
        }//lb和rb为左右界。
        int icount = 0;
        for(int i=0; i<=rb-lb; ++i)
        {
            if(!a[i])
            {
                ++icount;
                if(icount == n)
                {
                    ans = lb+i;
                    break;
                }
            }
        }
        printf("Case %d: %d\n",cas++,ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值