百度之星资格赛 1005 寻找母串(分块打表+组合数计算)

分析
打表发现,n长度的01偏串数量为一个卡特兰数,而长度为m的S串在n长度的01偏串中出现的次数跟S串具体无关,只跟长度有关,公式为\(C_{n-m+1}^{\frac{n-m}2}\),然后发现\(1<=n,m<=10^9,mod=10^9+7\),问了队友才知道用分块代表阶乘预处理,打出\(1e6,2e6,3e6...1e9\)共1000个数,然后就可以在\(O(10^6)\)得到\(n!,m!, (n-m)!\),注意除法计算要用逆元
trick
在n为奇数,n<m的情况下输出0

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

#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))

const ll mod=1e9+7;
char s[100100];
ll f[10000]={1,641102369,578095319,5832229,259081142,  974067448,  316220877,  690120224,  251368199,  980250487,  682498929,  134623568,  95936601,   933097914,  167332441,  598816162,  336060741,  248744620,  626497524,  288843364,  491101308,  245341950,  565768255,  246899319,  968999, 586350670,  638587686,  881746146,  19426633,   850500036,  76479948,   268124147,  842267748,  886294336,  485348706,  463847391,  544075857,  898187927,  798967520,  82926604,   723816384,  156530778,  721996174,  299085602,  323604647,  172827403,  398699886,  530389102,  294587621,  813805606,  67347853,   497478507,  196447201,  722054885,  228338256,  407719831,  762479457,  746536789,  811667359,  778773518,  27368307,   438371670,  59469516,   5974669,    766196482,  606322308,  86609485,   889750731,  340941507,  371263376,  625544428,  788878910,  808412394,  996952918,  585237443,  1669644,    361786913,  480748381,  595143852,  837229828,  199888908,  526807168,  579691190,  145404005,  459188207,  534491822,  439729802,  840398449,  899297830,  235861787,  888050723,  656116726,  736550105,  440902696,  85990869,   884343068,  56305184,   973478770,  168891766,  804805577,  927880474,  876297919,  934814019,  676405347,  567277637,  112249297,  44930135,   39417871,   47401357,   108819476,  281863274,  60168088,   692636218,  432775082,  14235602,   770511792,  400295761,  697066277,  421835306,  220108638,  661224977,  261799937,  168203998,  802214249,  544064410,  935080803,  583967898,  211768084,  751231582,  972424306,  623534362,  335160196,  243276029,  554749550,  60050552,   797848181,  395891998,  172428290,  159554990,  887420150,  970055531,  250388809,  487998999,  856259313,  82104855,   232253360,  513365505,  244109365,  1559745,    695345956,  261384175,  849009131,  323214113,  747664143,  444090941,  659224434,  80729842,   570033864,  664989237,  827348878,  195888993,  576798521,  457882808,  731551699,  212938473,  509096183,  827544702,  678320208,  677711203,  289752035,  66404266,   555972231,  195290384,  97136305,   349551356,  785113347,  83489485,   66247239,   52167191,   307390891,  547665832,  143066173,  350016754,  917404120,  296269301,  996122673,  23015220,   602139210,  748566338,  187348575,  109838563,  574053420,  105574531,  304173654,  542432219,  34538816,   325636655,  437843114,  630621321,  26853683,   933245637,  616368450,  238971581,  511371690,  557301633,  911398531,  848952161,  958992544,  925152039,  914456118,  724691727,  636817583,  238087006,  946237212,  910291942,  114985663,  492237273,  450387329,  834860913,  763017204,  368925948,  475812562,  740594930,  45060610,   806047532,  464456846,  172115341,  75307702,   116261993,  562519302,  268838846,  173784895,  243624360,  61570384,   481661251,  938269070,  95182730,   91068149,   115435332,  495022305,  136026497,  506496856,  710729672,  113570024,  366384665,  564758715,  270239666,  277118392,  79874094,   702807165,  112390913,  730341625,  103056890,  677948390,  339464594,  167240465,  108312174,  839079953,  479334442,  271788964,  135498044,  277717575,  591048681,  811637561,  353339603,  889410460,  839849206,  192345193,  736265527,  316439118,  217544623,  788132977,  618898635,  183011467,  380858207,  996097969,  898554793,  335353644,  54062950,   611251733,  419363534,  965429853,  160398980,  151319402,  990918946,  607730875,  450718279,  173539388,  648991369,  970937898,  500780548,  780122909,  39052406,   276894233,  460373282,  651081062,  461415770,  358700839,  643638805,  560006119,  668123525,  686692315,  673464765,  957633609,  199866123,  563432246,  841799766,  385330357,  504962686,  954061253,  128487469,  685707545,  299172297,  717975101,  577786541,  318951960,  773206631,  306832604,  204355779,  573592106,  30977140,   450398100,  363172638,  258379324,  472935553,  93940075,   587220627,  776264326,  793270300,  291733496,  522049725,  579995261,  335416359,  142946099,  472012302,  559947225,  332139472,  499377092,  464599136,  164752359,  309058615,  86117128,   580204973,  563781682,  954840109,  624577416,  895609896,  888287558,  836813268,  926036911,  386027524,  184419613,  724205533,  403351886,  715247054,  716986954,  830567832,  383388563,  68409439,   6734065,    189239124,  68322490,   943653305,  405755338,  811056092,  179518046,  825132993,  343807435,  985084650,  868553027,  148528617,  160684257,  882148737,  591915968,  701445829,  529726489,  302177126,  974886682,  241107368,  798830099,  940567523,  11633075,   325334066,  346091869,  115312728,  473718967,  218129285,  878471898,  180002392,  699739374,  917084264,  856859395,  435327356,  808651347,  421623838,  105419548,  59883031,   322487421,  79716267,   715317963,  429277690,  398078032,  316486674,  384843585,  940338439,  937409008,  940524812,  947549662,  833550543,  593524514,  996164327,  987314628,  697611981,  636177449,  274192146,  418537348,  925347821,  952831975,  893732627,  1277567,    358655417,  141866945,  581830879,  987597705,  347046911,  775305697,  125354499,  951540811,  247662371,  343043237,  568392357,  997474832,  209244402,  380480118,  149586983,  392838702,  309134554,  990779998,  263053337,  325362513,  780072518,  551028176,  990826116,  989944961,  155569943,  596737944,  711553356,  268844715,  451373308,  379404150,  462639908,  961812918,  654611901,  382776490,  41815820,   843321396,  675258797,  845583555,  934281721,  741114145,  275105629,  666247477,  325912072,  526131620,  252551589,  432030917,  554917439,  818036959,  754363835,  795190182,  909210595,  278704903,  719566487,  628514947,  424989675,  321685608,  50590510,   832069712,  198768464,  702004730,  99199382,   707469729,  747407118,  302020341,  497196934,  5003231,    726997875,  382617671,  296229203,  183888367,  703397904,  552133875,  732868367,  350095207,  26031303,   863250534,  216665960,  561745549,  352946234,  784139777,  733333339,  503105966,  459878625,  803187381,  16634739,   180898306,  68718097,   985594252,  404206040,  749724532,  97830135,   611751357,  31131935,   662741752,  864326453,  864869025,  167831173,  559214642,  718498895,  91352335,   608823837,  473379392,  385388084,  152267158,  681756977,  46819124,   313132653,  56547945,   442795120,  796616594,  256141983,  152028387,  636578562,  385377759,  553033642,  491415383,  919273670,  996049638,  326686486,  160150665,  141827977,  540818053,  693305776,  593938674,  186576440,  688809790,  565456578,  749296077,  519397500,  551096742,  696628828,  775025061,  370732451,  164246193,  915265013,  457469634,  923043932,  912368644,  777901604,  464118005,  637939935,  956856710,  490676632,  453019482,  462528877,  502297454,  798895521,  100498586,  699767918,  849974789,  811575797,  438952959,  606870929,  907720182,  179111720,  48053248,   508038818,  811944661,  752550134,  401382061,  848924691,  764368449,  34629406,   529840945,  435904287,  26011548,   208184231,  446477394,  206330671,  366033520,  131772368,  185646898,  648711554,  472759660,  523696723,  271198437,  25058942,   859369491,  817928963,  330711333,  724464507,  437605233,  701453022,  626663115,  281230685,  510650790,  596949867,  295726547,  303076380,  465070856,  272814771,  538771609,  48824684,   951279549,  939889684,  564188856,  48527183,   201307702,  484458461,  861754542,  326159309,  181594759,  668422905,  286273596,  965656187,  44135644,   359960756,  936229527,  407934361,  267193060,  456152084,  459116722,  124804049,  262322489,  920251227,  816929577,  483924582,  151834896,  167087470,  490222511,  903466878,  361583925,  368114731,  339383292,  388728584,  218107212,  249153339,  909458706,  322908524,  202649964,  92255682,   573074791,  15570863,   94331513,   744158074,  196345098,  334326205,  9416035,    98349682,   882121662,  769795511,  231988936,  888146074,  137603545,  582627184,  407518072,  919419361,  909433461,  986708498,  310317874,  373745190,  263645931,  256853930,  876379959,  702823274,  147050765,  308186532,  175504139,  180350107,  797736554,  606241871,  384547635,  273712630,  586444655,  682189174,  666493603,  946867127,  819114541,  502371023,  261970285,  825871994,  126925175,  701506133,  314738056,  341779962,  561011609,  815463367,  46765164,   49187570,   188054995,  957939114,  64814326,   933376898,  329837066,  338121343,  765215899,  869630152,  978119194,  632627667,  975266085,  435887178,  282092463,  129621197,  758245605,  827722926,  201339230,  918513230,  322096036,  547838438,  985546115,  852304035,  593090119,  689189630,  555842733,  567033437,  469928208,  212842957,  117842065,  404149413,  155133422,  663307737,  208761293,  206282795,  717946122,  488906585,  414236650,  280700600,  962670136,  534279149,  214569244,  375297772,  811053196,  922377372,  289594327,  219932130,  211487466,  701050258,  398782410,  863002719,  27236531,   217598709,  375472836,  810551911,  178598958,  247844667,  676526196,  812283640,  863066876,  857241854,  113917835,  624148346,  726089763,  564827277,  826300950,  478982047,  439411911,  454039189,  633292726,  48562889,   802100365,  671734977,  945204804,  508831870,  398781902,  897162044,  644050694,  892168027,  828883117,  277714559,  713448377,  624500515,  590098114,  808691930,  514359662,  895205045,  715264908,  628829100,  484492064,  919717789,  513196123,  748510389,  403652653,  574455974,  77123823,   172096141,  819801784,  581418893,  15655126,   15391652,   875641535,  203191898,  264582598,  880691101,  907800444,  986598821,  340030191,  264688936,  369832433,  785804644,  842065079,  423951674,  663560047,  696623384,  496709826,  161960209,  331910086,  541120825,  951524114,  841656666,  162683802,  629786193,  190395535,  269571439,  832671304,  76770272,   341080135,  421943723,  494210290,  751040886,  317076664,  672850561,  72482816,   493689107,  135625240,  100228913,  684748812,  639655136,  906233141,  929893103,  277813439,  814362881,  562608724,  406024012,  885537778,  10065330,   60625018,   983737173,  60517502,   551060742,  804930491,  823845496,  727416538,  946421040,  678171399,  842203531,  175638827,  894247956,  538609927,  885362182,  946464959,  116667533,  749816133,  241427979,  871117927,  281804989,  163928347,  563796647,  640266394,  774625892,  59342705,   256473217,  674115061,  918860977,  322633051,  753513874,  393556719,  304644842,  767372800,  161362528,  754787150,  627655552,  677395736,  799289297,  846650652,  816701166,  687265514,  787113234,  358757251,  701220427,  607715125,  245795606,  600624983,  10475577,   728620948,  759404319,  36292292,   491466901,  22556579,   114495791,  647630109,  586445753,  482254337,  718623833,  763514207,  66547751,   953634340,  351472920,  308474522,  494166907,  634359666,  172114298,  865440961,  364380585,  921648059,  965683742,  260466949,  117483873,  962540888,  237120480,  620531822,  193781724,  213092254,  107141741,  602742426,  793307102,  756154604,  236455213,  362928234,  14162538,   753042874,  778983779,  25977209,   49389215,   698308420,  859637374,  49031023,   713258160,  737331920,  923333660,  804861409,  83868974,   682873215,  217298111,  883278906,  176966527,  954913, 105359006,  390019735,  10430738,   706334445,  315103615,  567473423,  708233401,  48160594,   946149627,  346966053,  281329488,  462880311,  31503476,   185438078,  965785236,  992656683,  916291845,  881482632,  899946391,  321900901,  512634493,  303338827,  121000338,  967284733,  492741665,  152233223,  165393390,  680128316,  917041303,  532702135,  741626808,  496442755,  536841269,  131384366,  377329025,  301196854,  859917803,  676511002,  373451745,  847645126,  823495900,  576368335,  73146164,   954958912,  847549272,  241289571,  646654592,  216046746,  205951465,  3258987,    780882948,  822439091,  598245292,  869544707,  698611116};

ll inv(ll a,ll p)
{
    ll ans=1;
    for(;p;p>>=1,a=a*a%mod) if(p&1) ans=ans*a%mod;
    //printf("ans=%I64d\n",ans );
    return ans;
}
ll calc(ll num)
{
    int loc=num/1000000;
   //printf("loc=%d\n",loc );
    ll ans=f[loc];
    for(ll i=loc*1000000+1;i<=num;++i) ans=ans*i%mod;
    //printf("%I64d\n", ans);
    return ans;
}

int t;
ll x,y,n,m;

int main()
{
    for(scanf("%d",&t);t--;)
    {
        scanf("%I64d%s",&x,s);
        y=strlen(s);
        n=x-y+1,m=(x-y)/2;
        if(x&1||(x<y)) { puts("0");continue; }
        //printf("n=%lld m=%lld\n", n,m);
        //printf("n=%lld (%lld)=%lld (%lld)=%lld\n",calc(n),calc(m),calc(n-m) );
        //cout<<n<<m<<endl;
        //printf("%lld %lld %lld\n",calc(n),calc(m),calc(n-m) );
        printf("%I64d\n",calc(n)*inv(calc(m)*calc(n-m)%mod,mod-2)%mod );
    }
}

转载于:https://www.cnblogs.com/chendl111/p/7296184.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现分块查找的示例代码: ```c++ #include <iostream> #include <cmath> using namespace std; int blockSearch(int arr[], int n, int key, int blockSize) { int blockIndex = sqrt(n); int start = 0, end = blockIndex; while (end < n && arr[end] <= key) { start = end; end += blockIndex; if (end > n - 1) { end = n; } } for (int i = start; i < end; i++) { if (arr[i] == key) { return i; } } return -1; } int main() { int n, key, blockSize; cout << "Enter the size of array: "; cin >> n; int arr[n]; cout << "Enter the elements of array: "; for (int i = 0; i < n; i++) { cin >> arr[i]; } cout << "Enter the number to search: "; cin >> key; cout << "Enter the block size: "; cin >> blockSize; int index = blockSearch(arr, n, key, blockSize); if (index != -1) { cout << "Number found at index " << index << endl; } else { cout << "Number not found in array" << endl; } return 0; } ``` 在上面的代码中,我们首先定义了一个 `blockSearch` 函数,它接受四个参数:数组 `arr`,数组大小 `n`,要查找的数字 `key` 和块大小 `blockSize`。该函数首先计算出块的数量,并初始化 `start` 和 `end` 变量以包含第一个块。然后,它检查当前块的末尾位置是否小于数组的大小且其最后一个元素是否小于或等于要查找的数字。如果是,就将 `start` 和 `end` 更新为下一个块的开头和末尾。最后,它在 `start` 和 `end` 之间遍历数组,并搜索要查找的数字。如果找到了该数字,则返回其索引;否则返回 -1。 在 `main` 函数中,我们首先读入数组的大小和元素,然后读入要查找的数字和块的大小,并调用 `blockSearch` 函数来查找该数字。如果找到了该数字,则输出其索引;否则输出未找到该数字的消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值