国庆 day 3 上午

a
【问题描述】
        你是能看到第一题的 friends 呢。
                        ——hja
    怎么快速记单词呢?也许把单词分类再记单词是个不错的选择。何大爷给
  出了一种分单词的方法,何大爷认为两个单词是同一类的当这两个单词的各个
  字母的个数是一样的,如 dog 和 god。现在何大爷给了你?个单词,问这里总共
  有多少类单词。
【输入格式】
  第一行一个整数n代表单词的个数。
  接下来n行每行一个单词。
【输出格式】
  一行一个整数代表答案。
【样例输入】
  3
  AABAC
  CBAAA
  AAABB
【样例输出】
  2
【数据范围与规定】
  70%的数据,1 ≤ ? ≤ 100。
  对于100%的数据,1 ≤ ? ≤ 10000,所有单词由大写字母组成。
  P99 zhxb

思路:很简单,sort一下,set记录就好。

#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
string s;
set<string>s1;
using namespace std;
int main(){
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s;
        sort(s.begin(),s.end());
        s1.insert(s);
    }
    cout<<s1.size();
}
View Code

b
【问题描述】
      你是能看到第二题的 friends 呢。
                      ——laekov
    长度为?的铁丝,你可以将其分成若干段,并把每段都折成一个三角形。你
  还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的
  分法。
【输入格式】
  一行一个整数n。
【输出格式】
  一行一个整数代表答案对10 9 + 7取模之后的值。
【样例输入 1
  6
【样例输出 1】
  2
【样例输入 2】
  9
【样例输出 2】
  6
【样例解释 2】
  (1,1,1),(2,2,2);(2,2,2),(1,1,1)算两种方案。
【数据范围与规定】
  对于30%的数据,1≤n≤100。
  对于60%的数据,1 ≤n≤ 1000。
  对于100%的数据,1 ≤ n≤ 10^6 。
  P99 zhxc

思路:打表+

以下解题思路转自xxy大佬的博客

设分成的每段长为Li,g=gcd(Li)

那么一共有n/g 个单位

设f[g]表示以g为周长,且三边gcd为1 的三角形的个数

设h[n/g]表示把n/g个单位 分配给任意多个三角形的个数

那么 ans=Σ f[g]*h[n/g]   (g|n)

求f[g]:

设g=a+b+c,且a<=b<=c

对b和c的大小分两种情况讨论:

① b==c :

==> g=a+2b,那么b∈[ceil(g/3),floor((g-1)/2)]

所以f[g]=floor((g-1)/2)- ceil(g/3) +1

② b<c :

a,b,c 的每一种方案都可以看做由 a,b,c-1的每一种方案转移过来

但有一种除外:a+b=c,因为此时a,b,c-1 合法,a,b,c 不合法

当g为偶数时,a+b+a+b=g,g=2*(a+b),所以有floor(g/4)个

所以f[g]=f[g-1]+ (b&1)? 0 : -g/4

然后因为要求三边长互质,所以枚举g的每个因数k,f[g]-=f[k]

求h[i]:

把i个物品分成任意份的方案数=C(i-1,0)+C(i-1,1)+……+C(i-1,i-1)

= 2^(i-1)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1000010
#define mod 1000000007
using namespace std;
int n,ans;
int f[MAXN],dp[MAXN],more[MAXN];
void pre(){
    f[1]=0;f[2]=0;f[3]=1;f[4]=0;f[5]=1;f[6]=2;f[7]=2;f[8]=1;f[9]=6;f[10]=3;
    f[11]=4;f[12]=10;f[13]=5;f[14]=6;f[15]=25;f[16]=6;f[17]=8;f[18]=40;f[19]=10;f[20]=16;
    f[21]=81;f[22]=14;f[23]=14;f[24]=144;f[25]=31;f[26]=19;f[27]=280;f[28]=32;f[29]=21;f[30]=569;
    f[31]=24;f[32]=32;f[33]=1062;f[34]=32;f[35]=123;f[36]=2098;f[37]=33;f[38]=40;f[39]=4147;f[40]=188;
    f[41]=40;f[42]=8305;f[43]=44;f[44]=74;f[45]=16731;f[46]=58;f[47]=52;f[48]=32880;f[49]=182;f[50]=593;
    f[51]=65620;f[52]=100;f[53]=65;f[54]=131222;f[55]=1153;f[56]=408;f[57]=262248;f[58]=91;f[59]=80;f[60]=526534;
    f[61]=85;f[62]=104;f[63]=1049329;f[64]=256;f[65]=4266;f[66]=2097406;f[67]=102;f[68]=168;f[69]=4194453;f[70]=9435;
    f[71]=114;f[72]=8389356;f[73]=120;f[74]=147;f[75]=16793845;f[76]=210;f[77]=2431;f[78]=33554771;f[79]=140;f[80]=33664;
    f[81]=67109568;f[82]=180;f[83]=154;f[84]=134222278;f[85]=65816;f[86]=198;f[87]=268435687;f[88]=1764;f[89]=176;f[90]=537003715;
    f[91]=8689;f[92]=304;f[93]=73742080;f[94]=236;f[95]=262493;f[96]=147486386;f[97]=208;f[98]=16762;f[99]=294970616;f[100]=525236;
    f[101]=225;f[102]=589935100;f[103]=234;f[104]=5060;f[105]=180951179;f[106]=299;f[107]=252;f[108]=359743304;f[109]=261;f[110]=2100625;
    f[111]=719476629;f[112]=74624;f[113]=280;f[114]=438953217;f[115]=4194803;f[116]=476;f[117]=877914883;f[118]=370;f[119]=131884;f[120]=764219541;
    f[121]=4412;f[122]=395;f[123]=511620533;f[124]=544;f[125]=16777781;f[126]=23520200;f[127]=352;f[128]=33792;f[129]=46480812;f[130]=33561658;
    f[131]=374;f[132]=92971720;f[133]=525301;f[134]=476;f[135]=253064929;f[136]=67120;f[137]=408;f[138]=371843557;f[139]=420;f[140]=135276738;
    f[141]=743685675;f[142]=534;f[143]=21939;f[144]=487573369;f[145]=268436226;f[146]=564;f[147]=976838685;f[148]=768;f[149]=481;f[150]=486371819;
    f[151]=494;f[152]=264124;f[153]=899095103;f[154]=4230111;f[155]=73742696;f[156]=797942289;f[157]=533;f[158]=660;f[159]=595846044;f[160]=148044530;
    f[161]=8390048;f[162]=191955045;f[163]=574;f[164]=940;f[165]=678420224;f[166]=728;f[167]=602;f[168]=784611668;f[169]=21091;f[170]=590005152;
    f[171]=534052443;f[172]=1034;f[173]=645;f[174]=67051138;f[175]=213425504;f[176]=2234048;f[177]=134100040;f[178]=836;f[179]=690;f[180]=629164408;
    f[181]=705;f[182]=67159441;f[183]=536397479;f[184]=4197128;f[185]=719477490;f[186]=72794800;f[187]=271076;f[188]=1232;f[189]=281905179;f[190]=439221006;
    f[191]=784;f[192]=299637156;f[193]=800;f[194]=992;f[195]=460352967;f[196]=268453912;f[197]=833;f[198]=169414077;f[199]=850;f[200]=773118105;
    f[201]=329377190;f[202]=1075;f[203]=536873117;f[204]=658901564;f[205]=511621583;f[206]=1118;f[207]=325897438;f[208]=33737152;f[209]=1059738;f[210]=733120196;
    f[211]=954;f[212]=1560;f[213]=270017566;f[214]=1206;f[215]=46481967;f[216]=624195158;f[217]=147486152;f[218]=1251;f[219]=80066391;f[220]=97166226;
    f[221]=361480;f[222]=160132539;f[223]=1064;f[224]=429287396;f[225]=539823443;f[226]=1344;f[227]=1102;f[228]=641067392;f[229]=1121;f[230]=376045827;
    f[231]=875181021;f[232]=268439796;f[233]=1160;f[234]=629865643;f[235]=743687047;f[236]=1930;f[237]=124161904;f[238]=180068149;f[239]=1220;f[240]=282249196;
    f[241]=1240;f[242]=8396278;f[243]=630864590;f[244]=2060;f[245]=334482250;f[246]=993285370;f[247]=1352967;f[248]=73746777;f[249]=986566337;f[250]=966267700;
    f[251]=1344;f[252]=963458550;f[253]=16792899;f[254]=1696;f[255]=845680875;f[256]=147618802;f[257]=1408;f[258]=892519773;f[259]=438956020;f[260]=834130603;
    f[261]=321910893;f[262]=1804;f[263]=1474;f[264]=902808123;f[265]=595847773;f[266]=878514327;f[267]=140132997;f[268]=2482;f[269]=1541;f[270]=613538991;
    f[271]=1564;f[272]=590463176;f[273]=321617640;f[274]=1972;f[275]=450507987;f[276]=129468687;f[277]=1633;f[278]=2030;f[279]=389587111;f[280]=593581177;
    f[281]=1680;f[282]=484194447;f[283]=1704;f[284]=2784;f[285]=503383384;f[286]=144739395;f[287]=23244429;f[288]=608926200;f[289]=526056;f[290]=335498669;
    f[291]=873525635;f[292]=2940;f[293]=1825;f[294]=795703352;f[295]=134102175;f[296]=719483184;f[297]=352487218;f[298]=2331;f[299]=21030745;f[300]=829570449;
    f[301]=92965331;f[302]=2394;f[303]=976373910;f[304]=440334209;f[305]=536399754;f[306]=133930833;f[307]=2002;f[308]=727053010;f[309]=905487848;f[310]=146550417;
    f[311]=2054;f[312]=797987002;f[313]=2080;f[314]=2587;f[315]=504510638;f[316]=3440;f[317]=2133;f[318]=243886012;f[319]=73765456;f[320]=196774796;
    f[321]=487764748;f[322]=752192960;f[323]=2754708;f[324]=829784319;f[325]=666295098;f[326]=2788;f[327]=951050268;f[328]=511628523;f[329]=487375739;f[330]=519846041;
    f[331]=2324;f[332]=3794;f[333]=243152828;f[334]=2926;f[335]=329379927;f[336]=896160545;f[337]=2408;f[338]=167812001;f[339]=216758643;f[340]=253287221;
    f[341]=294994281;f[342]=313785635;f[343]=949486563;f[344]=46489602;f[345]=205731144;f[346]=3139;f[347]=2552;f[348]=270962932;f[349]=2581;f[350]=747536014;
    f[351]=559517020;f[352]=691504452;f[353]=2640;f[354]=936178016;f[355]=270020632;f[356]=4356;f[357]=679251333;f[358]=3360;f[359]=2730;f[360]=460748045;
    f[361]=2624190;f[362]=3435;f[363]=669268872;f[364]=334172790;f[365]=80069625;f[366]=978753869;f[367]=2852;f[368]=389086576;f[369]=980748370;f[370]=879627900;
    f[371]=191697606;f[372]=62528248;f[373]=2945;f[374]=376928566;f[375]=234374381;f[376]=743696112;f[377]=342266271;f[378]=229553181;f[379]=3040;f[380]=86304704;
    f[381]=319912198;f[382]=3824;f[383]=3104;f[384]=456014180;f[385]=767315472;f[386]=3904;f[387]=372608253;f[388]=5168;f[389]=3201;f[390]=851593334;
    f[391]=34475148;f[392]=776813524;f[393]=118533489;f[394]=4067;f[395]=124165684;f[396]=461120268;f[397]=3333;f[398]=4150;f[399]=554019519;f[400]=24380486;
    f[401]=3400;f[402]=948240916;f[403]=368810794;f[404]=5600;f[405]=100772050;f[406]=671149427;f[407]=877942283;f[408]=939442208;f[409]=3536;f[410]=504928656;
    f[411]=585867209;f[412]=5824;f[413]=268206895;f[414]=934037804;f[415]=986570502;f[416]=669929746;f[417]=343454580;f[418]=778379431;f[419]=3710;f[420]=335610456;
    f[421]=3745;f[422]=4664;f[423]=861186921;f[424]=595859187;f[425]=81465024;f[426]=747606243;f[427]=72802206;f[428]=6282;f[429]=481777696;f[430]=939025622;
    f[431]=3924;f[432]=179917090;f[433]=3960;f[434]=293274650;f[435]=108338739;f[436]=6516;f[437]=45617065;f[438]=961563981;f[439]=4070;f[440]=85432001;
    f[441]=173222533;f[442]=218768539;f[443]=4144;f[444]=285247559;f[445]=140137771;f[446]=5208;f[447]=692440708;f[448]=181485242;f[449]=4256;f[450]=503663955;
    f[451]=46525528;f[452]=7000;f[453]=769745987;f[454]=5396;f[455]=624680383;f[456]=36952570;f[457]=4408;f[458]=5491;f[459]=414821823;f[460]=525420403;
    f[461]=4485;f[462]=195576137;f[463]=4524;f[464]=141492500;f[465]=927048725;f[466]=5684;f[467]=4602;f[468]=917587263;f[469]=658763101;f[470]=227909764;
    f[471]=263377072;f[472]=134116266;f[473]=185971000;f[474]=526752805;f[475]=140092690;f[476]=572044619;f[477]=245196579;f[478]=5980;f[479]=4840;f[480]=251051250;
    f[481]=597521289;f[482]=6080;f[483]=901381976;f[484]=384464122;f[485]=873531291;f[486]=81799863;f[487]=5002;f[488]=536414764;f[489]=855737404;f[490]=351802543;
    f[491]=5084;f[492]=734795572;f[493]=148864986;f[494]=532754414;f[495]=902725507;f[496]=368561549;f[497]=540044894;f[498]=845857446;f[499]=5250;f[500]=46222437;
    f[501]=691697246;f[502]=6594;f[503]=5334;f[504]=531075295;f[505]=976380035;f[506]=541933468;f[507]=156419868;f[508]=8832;f[509]=5461;f[510]=630889204;
    f[511]=160143072;f[512]=881647212;f[513]=809398314;f[514]=6912;f[515]=905494218;f[516]=227148798;f[517]=974799163;f[518]=759494920;f[519]=268176839;f[520]=176474293;
    f[521]=5720;f[522]=746957132;f[523]=5764;f[524]=9394;f[525]=401665841;f[526]=7238;f[527]=591513220;f[528]=693257650;f[529]=58726138;f[530]=839769236;
    f[531]=558933992;f[532]=504447131;f[533]=558270181;f[534]=581429430;f[535]=487771615;f[536]=329397982;f[537]=162838617;f[538]=7571;f[539]=461110827;f[540]=760194731;
    f[541]=6165;f[542]=7684;f[543]=651330217;f[544]=199950520;f[545]=951057387;f[546]=610609693;f[547]=6302;f[548]=10268;f[549]=678110480;f[550]=215598287;
    f[551]=689865933;f[552]=422847279;f[553]=248335828;f[554]=8027;f[555]=823273101;f[556]=10570;f[557]=6533;f[558]=286028190;f[559]=232588345;f[560]=550616676;
    f[561]=641688027;f[562]=8260;f[563]=6674;f[564]=856694326;f[565]=216766287;f[566]=8378;f[567]=643650873;f[568]=270040853;f[569]=6816;f[570]=10575752;
    f[571]=6864;f[572]=876871637;f[573]=953622009;f[574]=10147215;f[575]=164828100;f[576]=103131694;f[577]=7008;f[578]=720533540;f[579]=814460419;f[580]=422754714;
    f[581]=973145904;f[582]=628918743;f[583]=383454843;f[584]=80090949;f[585]=210412823;f[586]=8979;f[587]=7252;f[588]=678691589;f[589]=743716893;f[590]=70323870;
    f[591]=31225166;f[592]=39137685;f[593]=7400;f[594]=777599332;f[595]=205603231;f[596]=12136;f[597]=124871317;f[598]=366855643;f[599]=7550;f[600]=748441320;
    f[601]=7600;f[602]=878370138;f[603]=158233051;f[604]=12464;f[605]=22977276;f[606]=998908369;f[607]=7752;f[608]=876039115;f[609]=5804546;f[610]=515200081;
    f[611]=718646208;f[612]=352050226;f[613]=7905;f[614]=9856;f[615]=507385951;f[616]=504944356;f[617]=8008;f[618]=982261152;f[619]=8060;f[620]=442860405;
    f[621]=606159688;f[622]=10114;f[623]=280281152;f[624]=380560125;f[625]=81648331;f[626]=10244;f[627]=947552966;f[628]=13468;f[629]=757981013;f[630]=407166986;
    f[631]=8374;f[632]=124190605;f[633]=431761439;f[634]=10507;f[635]=319921830;f[636]=55344476;f[637]=994990070;f[638]=922911884;f[639]=267073321;f[640]=96687145;
    f[641]=8640;f[642]=454021625;f[643]=8694;f[644]=915428148;f[645]=420773432;f[646]=416481261;f[647]=8802;f[648]=888624547;f[649]=536487196;f[650]=543527195;
    f[651]=805064391;f[652]=14514;f[653]=8965;f[654]=264040138;f[655]=118543730;f[656]=41099551;f[657]=688210286;f[658]=456196476;f[659]=9130;f[660]=788540947;
    f[661]=9185;f[662]=11454;f[663]=632455164;f[664]=986597957;f[665]=216673288;f[666]=426834782;f[667]=846186064;f[668]=15232;f[669]=448618719;f[670]=277676648;
    f[671]=145682417;f[672]=864781405;f[673]=9520;f[674]=11872;f[675]=536767859;f[676]=291790663;f[677]=9633;f[678]=588871703;f[679]=747069207;f[680]=994065097;
    f[681]=177710923;f[682]=784023935;f[683]=9804;f[684]=64193468;f[685]=585878395;f[686]=444036983;f[687]=710804765;f[688]=79908296;f[689]=979502647;f[690]=332920397;
    f[691]=10034;f[692]=16340;f[693]=653685751;f[694]=12586;f[695]=343466095;f[696]=929250733;f[697]=95592236;f[698]=12731;f[699]=372677413;f[700]=505554620;
    f[701]=10325;f[702]=484673687;f[703]=203423644;f[704]=26131550;f[705]=583750068;f[706]=13024;f[707]=952767238;f[708]=249696771;f[709]=10561;f[710]=17689299;
    f[711]=210988695;f[712]=140169231;f[713]=133059369;f[714]=142721121;f[715]=741851795;f[716]=17490;f[717]=850488986;f[718]=13470;f[719]=10860;f[720]=308702450;
    f[721]=810995891;f[722]=394781562;f[723]=401912787;f[724]=17880;f[725]=359648052;f[726]=278574349;f[727]=11102;f[728]=223324365;f[729]=674663557;f[730]=41699365;
    f[731]=374737300;f[732]=288178886;f[733]=11285;f[734]=14076;f[735]=119111885;f[736]=741314328;f[737]=317619815;f[738]=899077274;f[739]=11470;f[740]=340571402;
    f[741]=176555384;f[742]=680009780;f[743]=11594;f[744]=622059992;f[745]=692453917;f[746]=14539;f[747]=859093140;f[748]=953913486;f[749]=975551267;f[750]=462624064;
    f[751]=11844;f[752]=460669231;f[753]=543654149;f[754]=456025416;f[755]=769759553;f[756]=964948885;f[757]=12033;f[758]=15010;f[759]=666496731;f[760]=357067089;
    f[761]=12160;f[762]=349134363;f[763]=902123092;f[764]=19904;f[765]=655334128;f[766]=15328;f[767]=670835577;f[768]=180320395;f[769]=12416;f[770]=686482083;
    f[771]=792861970;f[772]=20320;f[773]=12545;f[774]=562467585;f[775]=824643127;f[776]=873568555;f[777]=289679775;f[778]=15811;f[779]=126699245;f[780]=517585453;
    f[781]=80194428;f[782]=302914607;f[783]=959897208;f[784]=9112574;f[785]=263391723;f[786]=371078861;f[787]=13002;f[788]=21168;f[789]=742114163;f[790]=650995270;
    f[791]=433541506;f[792]=724438873;f[793]=682343776;f[794]=16467;f[795]=2185994;f[796]=21600;f[797]=13333;f[798]=81385569;f[799]=952901881;f[800]=170768862;
    f[801]=153870972;f[802]=16800;f[803]=320396310;f[804]=406087068;f[805]=579427728;f[806]=833193940;f[807]=494205098;f[808]=976420385;f[809]=13736;f[810]=509535625;
    f[811]=13804;f[812]=642419509;f[813]=976765784;f[814]=26683670;f[815]=855753189;f[816]=576240377;f[817]=476351470;f[818]=17476;f[819]=626184202;f[820]=795515423;
    f[821]=14145;f[822]=814011073;f[823]=14214;f[824]=905536183;f[825]=43630219;f[826]=141227885;f[827]=14352;f[828]=736405228;f[829]=14421;f[830]=832512453;
    f[831]=511841099;f[832]=324425848;f[833]=546181775;f[834]=23677747;f[835]=691713808;f[836]=175324608;f[837]=322020648;f[838]=18340;f[839]=14770;f[840]=767314431;
    f[841]=637159360;f[842]=18515;f[843]=189167254;f[844]=24274;f[845]=678873291;f[846]=328298371;f[847]=103072287;f[848]=629436117;f[849]=756609450;f[850]=195474478;
    f[851]=211094749;f[852]=53481170;f[853]=15265;f[854]=31016620;f[855]=568345655;f[856]=487816850;f[857]=15408;f[858]=850175264;f[859]=15480;f[860]=328639424;
    f[861]=666978539;f[862]=19404;f[863]=15624;f[864]=324264527;f[865]=268194598;f[866]=19584;f[867]=616828971;f[868]=82189470;f[869]=496800197;f[870]=728037434;
    f[871]=647313682;f[872]=951104277;f[873]=433958153;f[874]=955530808;f[875]=883697445;f[876]=534090545;f[877]=16133;f[878]=20130;f[879]=747373447;f[880]=305347883;
    f[881]=16280;f[882]=739910174;f[883]=16354;f[884]=526496827;f[885]=951951571;f[886]=20498;f[887]=16502;f[888]=136131504;f[889]=639854892;f[890]=721663891;
    f[891]=128450027;f[892]=27104;f[893]=450498982;f[894]=915295756;f[895]=162857622;f[896]=456853444;f[897]=839130012;f[898]=21056;f[899]=991045957;f[900]=768095880;
    f[901]=771039188;f[902]=126859099;f[903]=345818228;f[904]=216816631;f[905]=651349642;f[906]=644141987;f[907]=17252;f[908]=28082;f[909]=241025460;f[910]=847370936;
    f[911]=17404;f[912]=988882810;f[913]=946433209;f[914]=21812;f[915]=441507462;f[916]=28576;f[917]=237099395;f[918]=862554513;f[919]=17710;f[920]=127568390;
    f[921]=611272228;f[922]=22195;f[923]=350565947;f[924]=29652432;f[925]=766970575;f[926]=22388;f[927]=256047019;f[928]=396024127;f[929]=18096;f[930]=35461180;
    f[931]=709833501;f[932]=29580;f[933]=779999326;f[934]=22776;f[935]=541127788;f[936]=796981924;f[937]=18408;f[938]=556093119;f[939]=119924357;f[940]=342870726;
    f[941]=18565;f[942]=239842981;f[943]=330471863;f[944]=475244359;f[945]=388140789;f[946]=941357867;f[947]=18802;f[948]=207849885;f[949]=400835301;f[950]=869128616;
    f[951]=918419448;f[952]=140326942;f[953]=19040;f[954]=716536167;f[955]=953643625;f[956]=31120;f[957]=913775800;f[958]=23960;f[959]=171769805;f[960]=365139645;
    f[961]=769822937;f[962]=383588360;f[963]=669918431;f[964]=31640;f[965]=814482483;f[966]=167763046;f[967]=19602;f[968]=390506098;f[969]=52884710;f[970]=502564403;
    f[971]=19764;f[972]=234634222;f[973]=686945595;f[974]=24766;f[975]=570319034;f[976]=127176969;f[977]=20008;f[978]=217817386;f[979]=560723938;f[980]=566226326;
    f[981]=337727721;f[982]=25174;f[983]=20254;f[984]=243933741;f[985]=31248147;f[986]=223225457;f[987]=237502017;f[988]=814899512;f[989]=835294271;f[990]=585935671;
    f[991]=20584;f[992]=927533220;f[993]=968676492;f[994]=36205524;f[995]=124894767;f[996]=910792481;f[997]=20833;f[998]=26000;f[999]=209273186;f[1000]=523080925;
}
void work(){
    dp[3]=1;
    for(int i=4;i<=n;i++){
        dp[i]=dp[i-1]+(i-1)/2-i/3+(i%3?0:1);
        if(i%2==0)    dp[i]-=i/4;
        dp[i]%=mod;
        if(dp[i]<0)    dp[i]+=mod;
    }
    more[1]=1;
    for(int i=2;i<=n;i++){
        more[i]=(more[i-1]*2)%mod;
        for(int j=2;i*j<=n;j++){
            dp[i*j]-=dp[i];
            if(dp[i*j]<0)    dp[i*j]+=mod;    
        }
    }
    return ;
}
int main(){
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    pre();
    scanf("%d",&n);
    if(n<=1000){
        cout<<f[n];
        return 0;
    }
    else{
        work();
        for(int i=1;i*i<=n;i++){
            if(n%i!=0)    continue;
            ans=(ans+1ll*dp[i]*more[n/i])%mod;
            if(i*i!=n)
                ans=(ans+1ll*dp[n/i]*more[i])%mod;    
        }
        cout<<ans;
    }
}
View Code

c
【问题描述】
      你是能看到第三题的 friends 呢。
                      ——aoao
    在小学的时候,我们都学过正视图和左视图。现在何大爷用一些小方块摆了
  一个图形,并给出了你这个图形的左视图和正视图。现在何大爷希望知道,在给
  定正视图和左视图的情况下,原来的立体图形有多少种可能的情况?
【输入格式】
  第一行两个整数n,m,代表在左视图和正视图中分别有多少列。
  第二n个整数,代表在左视图中从左至右每一列的高度。
  第三行m个整数,代表在正视图中从左至有每一列的高度。
【输出格式】
  一行一个整数代表答案对10 9 + 9取模之后的值。
【样例输入 1】
  2 2
  1 1
  1 1
【样例输出 1】
  7
【样例输入 2】
  4 5
  5 2 4 1
  5 2 4 0 1
【样例输出 2】
  429287
【数据规模与约定】
  对于20%的数据,1 ≤ n,m ≤ 5,每列的最大高度不超过5。
  对于40%的数据,n + m ≤ 18。
  对于100%的数据,1 ≤ n,m ≤ 50,每列最大高度不超过10000。

以下解题思路转自xxy大佬的博客

思路:容斥原理

解决本题的关键:行交换。列交换对答案不影响

将左视图按从下往上递减,正视图从左往右递减排列

那整张图的高度从左下到右上呈阶梯状递减

这样所有高度相同的呈现倒‘L’形,如下图所示蓝色部分

如果我们按高度递减的顺序依次计算每个倒‘L’形的方案数,那么这些倒‘L’形相对独立

答案就是所有倒‘L’形答案的乘积

 

如何计算单个倒‘L’形的答案?——容斥原理

假设上图为已经按高度排好序的图

设当前正在处理高度为h的倒‘L’形

令nn表示当前有nn行的左视图高度为h,mm表示当前有mm列的主视图高度为h

n表示当前有n行的左视图高度>=h,m表示当前有m列的主视图高度>=h

定义性质pk表示 在这nn行mm列中,有k行/列不满足看到的高度为h

那根据容斥原理,

不具有任何一个性质p的方案和=

全集-Σ|pi|+Σ|pi∩pj|-Σ|pi∩pj∩pk|+…+(-1)^m*|p1∩p2∩…∩pm|

也就是所有方案-所有1行/列不满足条件的方案+所有2行/列不满足条件的方案-……

如何求有k行/列不满足条件的方案数?

设现在要求在倒‘L’形中,有i行j列不满足条件的方案数A,i+j=k

那么A分为两部分

① i行j列不能满足条件的部分:

当前高度为h,不能满足条件,每一个各自可以填[0,h-1],每个格子有h种方案

所以此时方案数=h^ (n*m-(n-i)*(m-j))

② 倒‘L’形中其他位置可以任意填的部分

 当前高度为h,任意填就是可以填[0,h],每个各自有h+1种方案

所以此时的方案数=(h+1)^((n-i)*(m-j)-(n-nn)*(m-mm))

这是选定i行j列,所以还要乘上在nn行中选i行,在mm列中选j列的方案

终上所述,每个倒‘L’形 的答案为 (-1)^(i+j)* C(nn,i)* C(mm,j)* h^ (n*m-(n-i)*(m-j)) * (h+1)^((n-i)*(m-j)-(n-nn)*(m-mm))

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 10001
#define mod 1000000009
using namespace std;
int n,m;
int c[51][51];
int a[MAXN],b[MAXN];
void pre(int k){
    for(int i=0;i<=k;i++)    c[i][0]=1;
    for(int i=1;i<=k;i++)
        for(int j=1;j<=i;j++)
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
int pow(int a,int b){
    int res=1;
    for(;b;b>>=1,a=1ll*a*a%mod)
        if(b&1)    res=1ll*res*a%mod;
    return res;
}
int cal(int n,int m,int nn,int mm,int h){
    int res=0,tmp;
    for(int i=0;i<=nn;i++)
        for(int j=0;j<=mm;j++){
            tmp=1ll*pow(h,n*m-(n-i)*(m-j))*pow(h+1,(n-i)*(m-j)-(n-nn)*(m-mm))%mod*c[nn][i]%mod*c[mm][j]%mod;
            if((i+j)&1)    res=((res-tmp)%mod+mod)%mod;
            else res+=tmp,res%=mod;
        }
    return res;
}
int main(){
    freopen("c.in","r",stdin);
    freopen("c.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        a[x]++;
    }
    for(int i=1;i<=m;i++){
        int x;
        scanf("%d",&x);
        b[x]++; 
    }
    pre(max(n,m));
    long long res=1;
    int nown=0,nowm=0;
    for(int i=10000;i>=0;i--)
        if(a[i]||b[i]){
            nown+=a[i];
            nowm+=b[i];
            res=1ll*res*cal(nown,nowm,a[i],b[i],i)%mod;
        }
    cout<<res;
}
View Code
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
原文地址:https://www.cnblogs.com/cangT-Tlan/p/7642204.html