bzoj3798: 特殊的质数

来源:互联网 发布:智能电网通信网络 编辑:程序博客网 时间:2024/05/22 10:44

链接

  http://www.lydsy.com/JudgeOnline/problem.php?id=3798

题解

  容易发现判断一个数是否合法是O(N)的,而且每个数都可以单独做,因此可以分块打表。
  每N个数求一下答案,询问直接O(N)做即可。
  适当调整打表的间隔能让计算的次数减少。

代码

//分块打表#include <cstdio>#include <algorithm>#include <cmath>#define block 150000#define maxn 300000001#define lim 100000using namespace std;int biao[2017]={0,6907,12981,18819,24523,30077,35585,41010,46430,51724,57023,62283,67489,72705,77879,82972,88055,93155,98240,103321,108284,113328,118375,123362,128270,133275,138219,143207,148121,153006,157925,162787,167675,172566,177433,182248,187048,191887,196709,201503,206333,211116,215966,220684,225463,230264,235069,239856,244581,249301,253974,258746,263482,268180,272885,277603,282271,286985,291710,296422,301101,305757,310444,315110,319813,324445,329106,333704,338394,342976,347665,352294,356909,361557,366160,370808,375439,380078,384728,389366,393993,398583,403209,407827,412333,416969,421556,426079,430660,435206,439791,444343,448901,453464,457972,462546,467135,471649,476215,480762,485275,489787,494311,498717,503251,507793,512383,516895,521398,525932,530472,534962,539450,543990,548499,552993,557493,562021,566514,570989,575503,579963,584484,588945,593357,597873,602379,606833,611346,615806,620283,624716,629187,633659,638124,642547,646968,651442,655897,660327,664771,669231,673688,678173,682576,687052,691478,695980,700326,704735,709115,713555,717989,722424,726882,731296,735740,740137,744563,748889,753318,757686,762199,766618,771012,775415,779827,784197,788611,792973,797361,801781,806180,810564,814963,819309,823752,828180,832596,836953,841364,845749,850080,854472,858875,863253,867592,872013,876358,880744,885138,889481,893857,898212,902573,906912,911332,915667,920007,924356,928780,933139,937520,941889,946295,950616,955026,959308,963624,967986,972309,976647,980962,985307,989647,993976,998272,1002562,1006935,1011215,1015619,1019959,1024321,1028638,1032962,1037265,1041665,1045928,1050175,1054476,1058798,1063072,1067388,1071730,1076029,1080355,1084692,1089019,1093331,1097657,1101903,1106214,1110568,1114845,1119226,1123489,1127772,1132097,1136475,1140769,1145026,1149293,1153592,1157925,1162244,1166586,1170911,1175158,1179444,1183812,1188093,1192378,1196660,1201001,1205285,1209591,1213868,1218111,1222393,1226677,1230996,1235257,1239605,1243837,1248112,1252388,1256652,1260962,1265205,1269497,1273689,1277958,1282286,1286557,1290771,1294997,1299249,1303447,1307765,1312014,1316314,1320577,1324799,1329102,1333417,1337630,1341880,1346124,1350402,1354624,1358925,1363167,1367411,1371680,1375934,1380190,1384448,1388664,1392850,1397133,1401374,1405619,1409899,1414173,1418381,1422676,1426913,1431165,1435430,1439692,1443939,1448219,1452383,1456637,1460920,1465120,1469369,1473621,1477838,1482078,1486323,1490584,1494787,1499018,1503239,1507485,1511686,1515936,1520184,1524402,1528622,1532811,1536997,1541268,1545503,1549669,1553884,1558140,1562352,1566525,1570716,1574950,1579176,1583352,1587542,1591780,1596005,1600182,1604386,1608561,1612824,1617053,1621217,1625407,1629636,1633816,1637991,1642288,1646485,1650670,1654854,1659060,1663265,1667470,1671700,1675962,1680125,1684320,1688539,1692725,1696863,1701029,1705278,1709505,1713725,1717894,1722095,1726276,1730436,1734628,1738807,1743049,1747205,1751415,1755537,1759726,1763839,1768063,1772246,1776452,1780671,1784845,1789019,1793234,1797448,1801691,1805871,1810034,1814143,1818274,1822528,1826619,1830793,1834965,1839214,1843403,1847581,1851727,1855856,1860038,1864207,1868375,1872540,1876750,1880878,1885060,1889297,1893453,1897679,1901914,1906069,1910178,1914346,1918528,1922737,1926888,1931029,1935238,1939421,1943602,1947727,1951862,1956076,1960267,1964430,1968635,1972724,1976891,1981017,1985214,1989438,1993573,1997721,2001898,2006033,2010199,2014373,2018537,2022702,2026883,2031020,2035213,2039323,2043518,2047682,2051851,2055971,2060105,2064275,2068399,2072561,2076720,2080845,2084942,2089097,2093257,2097407,2101582,2105738,2109871,2113990,2118142,2122304,2126472,2130618,2134829,2138962,2143126,2147172,2151307,2155442,2159590,2163758,2167857,2171965,2176089,2180269,2184426,2188547,2192704,2196835,2200944,2205083,2209267,2213444,2217573,2221739,2225896,2230006,2234079,2238231,2242347,2246480,2250627,2254788,2258956,2263079,2267183,2271245,2275351,2279483,2283602,2287747,2291870,2295997,2300125,2304177,2308305,2312443,2316527,2320691,2324784,2328942,2333021,2337139,2341233,2345411,2349535,2353608,2357731,2361872,2366049,2370149,2374259,2378388,2382543,2386653,2390846,2394902,2399011,2403099,2407218,2411351,2415525,2419627,2423655,2427745,2431863,2436001,2440153,2444352,2448408,2452482,2456605,2460744,2464800,2468912,2473016,2477113,2481259,2485399,2489485,2493631,2497687,2501804,2505870,2509986,2514115,2518175,2522247,2526330,2530464,2534604,2538640,2542791,2546914,2551055,2555158,2559256,2563388,2567510,2571581,2575664,2579784,2583836,2587996,2592090,2596186,2600254,2604332,2608394,2612446,2616565,2620672,2624787,2628831,2632916,2636967,2641068,2645217,2649274,2653318,2657389,2661469,2665564,2669664,2673788,2677901,2682014,2686173,2690185,2694253,2698331,2702412,2706497,2710548,2714585,2718791,2722854,2726903,2730937,2735080,2739146,2743293,2747379,2751458,2755521,2759665,2763725,2767807,2771910,2775981,2780032,2784117,2788181,2792309,2796375,2800480,2804531,2808593,2812655,2816741,2820817,2824952,2828967,2833047,2837100,2841212,2845296,2849324,2853362,2857493,2861494,2865535,2869649,2873737,2877770,2881889,2885940,2889991,2894042,2898103,2902173,2906206,2910319,2914399,2918453,2922532,2926597,2930590,2934703,2938751,2942867,2946975,2951035,2955118,2959193,2963264,2967240,2971294,2975367,2979394,2983431,2987487,2991612,2995729,2999799,3003870,3007900,3011995,3016009,3020076,3024129,3028203,3032258,3036319,3040326,3044374,3048458,3052500,3056533,3060590,3064626,3068663,3072755,3076832,3080941,3084974,3089049,3093104,3097083,3101172,3105214,3109288,3113376,3117453,3121506,3125574,3129663,3133708,3137800,3141847,3145895,3149966,3154060,3158028,3162037,3166087,3170165,3174204,3178276,3182311,3186336,3190402,3194439,3198557,3202633,3206687,3210815,3214875,3218845,3222872,3226984,3231004,3235040,3239093,3243108,3247131,3251142,3255170,3259118,3263155,3267184,3271223,3275208,3279318,3283348,3287384,3291422,3295473,3299511,3303562,3307587,3311593,3315658,3319678,3323750,3327732,3331730,3335736,3339778,3343791,3347848,3351895,3355956,3359937,3363969,3368022,3372104,3376130,3380175,3384216,3388181,3392202,3396270,3400279,3404348,3408376,3412424,3416458,3420476,3424487,3428513,3432504,3436495,3440545,3444597,3448648,3452685,3456690,3460716,3464730,3468740,3472753,3476807,3480802,3484813,3488810,3492860,3496927,3500974,3505032,3509080,3513143,3517154,3521171,3525176,3529275,3533256,3537333,3541338,3545335,3549376,3553394,3557385,3561475,3565457,3569426,3573441,3577482,3581527,3585577,3589608,3593594,3597609,3601624,3605598,3609693,3613719,3617730,3621779,3625779,3629813,3633805,3637897,3641891,3645881,3649883,3653950,3658043,3662084,3666071,3670105,3674133,3678172,3682237,3686168,3690189,3694149,3698126,3702151,3706109,3710195,3714215,3718229,3722277,3726326,3730346,3734399,3738327,3742387,3746382,3750447,3754439,3758470,3762471,3766488,3770462,3774512,3778457,3782494,3786467,3790455,3794467,3798471,3802487,3806532,3810589,3814570,3818572,3822594,3826645,3830626,3834609,3838551,3842566,3846531,3850507,3854488,3858453,3862541,3866590,3870566,3874525,3878498,3882447,3886491,3890531,3894547,3898548,3902460,3906443,3910369,3914407,3918400,3922374,3926401,3930413,3934443,3938412,3942498,3946506,3950555,3954565,3958645,3962592,3966568,3970522,3974536,3978469,3982460,3986416,3990416,3994425,3998438,4002460,4006464,4010462,4014469,4018479,4022481,4026440,4030424,4034402,4038441,4042430,4046464,4050446,4054424,4058424,4062451,4066439,4070475,4074534,4078473,4082482,4086435,4090425,4094421,4098402,4102417,4106375,4110356,4114378,4118385,4122387,4126380,4130398,4134353,4138342,4142364,4146359,4150324,4154338,4158364,4162289,4166236,4170253,4174224,4178205,4182183,4186173,4190141,4194117,4198063,4202067,4206045,4210029,4213982,4218016,4221985,4225976,4229915,4233899,4237862,4241840,4245785,4249721,4253702,4257683,4261661,4265623,4269625,4273616,4277598,4281510,4285399,4289381,4293351,4297351,4301295,4305283,4309218,4313209,4317235,4321279,4325294,4329216,4333234,4337216,4341144,4345095,4349053,4353065,4357049,4361015,4364926,4368941,4372936,4376866,4380845,4384941,4388879,4392868,4396851,4400869,4404832,4408763,4412694,4416679,4420721,4424680,4428609,4432574,4436580,4440543,4444490,4448435,4452307,4456235,4460241,4464242,4468140,4472130,4476148,4480094,4484076,4488043,4492007,4495971,4499966,4503957,4507856,4511881,4515919,4519873,4523774,4527749,4531708,4535678,4539593,4543547,4547523,4551524,4555492,4559476,4563438,4567390,4571337,4575343,4579285,4583336,4587326,4591301,4595266,4599211,4603201,4607138,4611140,4615070,4619006,4622923,4626876,4630848,4634797,4638725,4642678,4646669,4650560,4654550,4658586,4662512,4666451,4670395,4674351,4678272,4682243,4686246,4690161,4694102,4698103,4702036,4706007,4709967,4713900,4717907,4721853,4725825,4729855,4733810,4737851,4741776,4745721,4749662,4753627,4757587,4761561,4765523,4769430,4773349,4777296,4781303,4785262,4789240,4793167,4797110,4801064,4805015,4808985,4812919,4816891,4820843,4824805,4828751,4832685,4836651,4840681,4844681,4848640,4852520,4856492,4860461,4864388,4868343,4872296,4876204,4880180,4884125,4888078,4892073,4896011,4899971,4903891,4907830,4911785,4915708,4919690,4923627,4927573,4931525,4935488,4939471,4943379,4947360,4951297,4955244,4959210,4963180,4967185,4971097,4975039,4978997,4982941,4986927,4990898,4994811,4998802,5002753,5006709,5010753,5014695,5018629,5022572,5026493,5030447,5034362,5038280,5042172,5046095,5050085,5054025,5057918,5061913,5065846,5069825,5073749,5077659,5081540,5085500,5089420,5093333,5097276,5101203,5105128,5109090,5113028,5116967,5120911,5124845,5128805,5132783,5136751,5140731,5144683,5148606,5152565,5156547,5160448,5164342,5168285,5172232,5176205,5180106,5184109,5187966,5191911,5195881,5199832,5203797,5207735,5211713,5215577,5219488,5223432,5227387,5231349,5235256,5239191,5243171,5247056,5250964,5254965,5258925,5262894,5266812,5270741,5274678,5278673,5282588,5286477,5290378,5294275,5298144,5302019,5305965,5309861,5313783,5317710,5321597,5325529,5329410,5333297,5337228,5341158,5345130,5349106,5353090,5357047,5360987,5364835,5368777,5372738,5376687,5380633,5384561,5388471,5392412,5396329,5400260,5404200,5408176,5412117,5415999,5419924,5423862,5427831,5431730,5435680,5439576,5443453,5447430,5451333,5455226,5459147,5463064,5466941,5470840,5474760,5478624,5482536,5486492,5490371,5494277,5498232,5502195,5506135,5510039,5513901,5517813,5521787,5525740,5529669,5533526,5537479,5541485,5545490,5549334,5553270,5557156,5561088,5564989,5569012,5572922,5576856,5580735,5584661,5588600,5592568,5596537,5600456,5604343,5608256,5612150,5616080,5619974,5623891,5627890,5631819,5635731,5639637,5643587,5647453,5651328,5655270,5659237,5663184,5667110,5670984,5674898,5678827,5682698,5686577,5690537,5694409,5698354,5702318,5706173,5710109,5713948,5717944,5721870,5725731,5729670,5733639,5737555,5741443,5745303,5749172,5753109,5756961,5760903,5764804,5768742,5772635,5776526,5780367,5784324,5788267,5792263,5796180,5800089,5804031,5807963,5811864,5815758,5819649,5823533,5827443,5831423,5835365,5839332,5843240,5847110,5851025,5854947,5858853,5862786,5866720,5870662,5874545,5878520,5882443,5886329,5890249,5894167,5898082,5901946,5905884,5909822,5913706,5917583,5921479,5925412,5929364,5933314,5937234,5941165,5945067,5949001,5952884,5956845,5960805,5964740,5968688,5972550,5976465,5980358,5984245,5988135,5992078,5995955,5999789,6003727,6007587,6011523,6015453,6019332,6023149,6027082,6030974,6034853,6038756,6042691,6046625,6050499,6054410,6058265,6062193,6066107,6070008,6073902,6077811,6081675,6085556,6089462,6093411,6097313,6101184,6105113,6109000,6112891,6116818,6120762,6124583,6128580,6132525,6136360,6140313,6144218,6148110,6152008,6155978,6159871,6163727,6167591,6171484,6175450,6179363,6183213,6187115,6191134,6195055,6198883,6202722,6206615,6210515,6214485,6218376,6222252,6226141,6230025,6233938,6237903,6241840,6245745,6249668,6253594,6257432,6261229,6265068,6268950,6272840,6276725,6280571,6284431,6288392,6292248,6296195,6300083,6303956,6307854,6311696,6315578,6319453,6323413,6327275,6331172,6335060,6339009,6342913,6346739,6350655,6354521,6358418,6362295,6366231,6370124,6374040,6377932,6381839,6385750,6389658,6393566,6397478,6401309,6405186,6409020,6412930,6416840,6420720,6424585,6428495,6432352,6436193,6440084,6444010,6447930,6451825,6455682,6459614,6463538,6467478,6471304,6475181,6479075,6483010,6486895,6490742,6494656,6498618,6502519,6506403,6510279,6514172,6518114,6521984,6525868,6529733,6533690,6537563,6541470,6545335,6549285,6553156,6556996,6560880,6564770,6568686,6572574,6576379,6580260,6584179,6588087,6592023,6595957,6599801,6603686,6607534,6611498,6615402,6619295,6623154,6627012,6630892,6634763,6638600,6642444,6646318,6650124,6654054,6657923,6661772,6665670,6669486,6673402,6677310,6681238,6685076,6688966,6692830,6696711,6700591,6704527,6708496,6712367,6716288,6720189,6724106,6727968,6731839,6735695,6739519,6743394,6747276,6751153,6755026,6758910,6762785,6766666,6770496,6774395,6778244,6782076,6785926,6789787,6793732,6797654,6801526,6805406,6809299,6813192,6817092,6820939,6824778,6828648,6832526,6836379,6840276,6844146,6848018,6851866,6855736,6859666,6863633,6867491,6871326,6875182,6879074,6882924,6886752,6890595,6894504,6898361,6902222,6906086,6909902,6913799,6917637,6921532,6925453,6929345,6933283,6937122,6940998,6944833,6948762,6952622,6956544,6960447,6964310,6968229,6972096,6975908,6979838,6983701,6987595,6991452,6995368,6999239,7003107,7006943,7010775,7014637,7018575,7022468,7026415,7030312,7034157,7038006,7041839,7045744,7049594,7053483,7057362,7061274,7065193,7069099,7072943,7076794,7080724,7084585,7088439,7092253,7096124,7099975,7103866,7107734,7111604,7115505,7119400,7123329,7127239,7131104,7134977,7138851,7142700,7146532,7150405,7154306,7158212,7162172,7166055,7169862,7173763,7177687,7181638,7185447,7189298,7193111,7197008,7200837,7204679,7208623,7212507,7216339,7220202,7224118,7227967,7231835,7235742,7239661,7243543,7247438,7251357,7255179,7259027,7262872,7266717,7270545,7274373,7278251,7282125,7285994,7289846,7293745,7297598,7301442,7305296,7309180,7312990,7316887,7320805,7324659,7328587,7332442,7336316,7340210,7344014,7347817,7351617,7355504,7359348,7363210,7367121,7371013,7374873,7378732,7382564,7386365,7390225,7394032,7397960,7401866,7405702,7409538,7413381,7417288,7421154,7424989,7428828,7432639,7436505,7440294,7444221,7448114,7451987,7455841,7459750,7463635,7467497,7471320,7475239,7479118,7482955,7486781,7490626,7494521,7498371,7502254,7506108,7509988,7513803,7517707,7521554,7525392,7529243,7533105,7536973,7540804,7544632,7548535,7552417,7556313,7560144,7563980,7567793,7571641,7575469,7579338,7583155,7587022,7590867,7594705,7598547,7602390,7606308,7610137,7614010,7617858,7621710,7625549,7629447,7633277,7637111,7640910,7644816,7648660,7652551,7656431,7660323,7664134,7667913,7671776,7675667,7679488,7683320,7687146,7691000,7694861,7698748,7702574,7706478,7710348,7714198,7718028,7721924,7725778,7729574,7733442,7737362,7741178,7744945,7748766,7752697,7756540,7760403,7764213,7768083,7771905,7775729,7779545,7783381,7787226,7791111,7795028,7798890,7802758,7806612,7810459,7814302,7818155,7822033,7825842,7829704,7833550,7837438,7841312,7845183,7848885,7852736,7856583,7860490,7864364,7868183,7872018,7875854,7879768,7883588,7887428,7891312,7895233,7899144,7902975,7906819,7910582,7914416,7918312,7922224,7926037,7929911,7933766,7937545,7941378,7945188,7949032,7952909,7956760,7960587,7964451,7968282,7972124,7975961,7979866,7983734,7987569,7991425,7995266,7999125,8002935,8006751,8010615,8014495,8018323,8022105,8025983,8029775,8033583,8037448,8041400,8045223,8049029,8052854,8056748,8060613,8064377,8068236,8072033,8075950,8079782,8083627,8087510,8091339,8095135,8098912,8102726,8106543,8110337,8114188,8118011,8121898,8125719};int prime[30000000], a, b;bool mark[lim];inline bool fang(int x){    int t=sqrt(x);    return t*t==x;}void init(){    int i, j;    for(i=2;i*i<=b;i++)    {        if(!mark[i])prime[++prime[0]]=i;        for(j=1;(long long)i*prime[j]<=b and (long long)i*prime[j]<lim;j++)        {            mark[i*prime[j]]=1;            if(i%prime[j]==0)break;        }    }}inline bool judge(int x){    int i;    for(i=1;prime[i]*prime[i]<=x and i<=prime[0];i++)if(x%prime[i]==0)return false;    for(i=1;i*i<x;i++)if(fang(x-i*i))return true;    return false;}int solve(int x){    int i, j, ans;    for(i=0;i<=x;i+=block);i-=block;ans=biao[i/block];    for(j=i+1;j<=x;j++)if(judge(j))ans++;    return ans;}int main(){    scanf("%d%d",&a,&b);    init();    printf("%d",solve(b)-solve(a-1));    return 0;}
0 0