当前位置:首页 >> 助手公告

CF一键领取补题(Suippes#714)

来源:珍惜运维 时间:2022-06-17 15:01:13

补题:Codeforces 714(Div.2)(A-C)

A.Array and Peaks

假如三个宽度为的字符串包涵且仅包涵中每一数一场,所以那个字符串被称作三个排序。现取值三个有理数,试内部结构三个的排序,因此那个排序有个最大值。对大小不一为的字符串的负号,假如有因此,所以是三个最大值点。 假如难以内部结构出这种的排序,所以输出-1.输出文件格式第二行包涵三个有理数(),则表示试验万萨县。后的,第一行包涵三个用字符合二为一的有理数:,依次则表示字符串的宽度和明确要求的最大值经验值。输出文件格式输出行。对每三个试验组,假如没具备条件的字符串,所以输出.不然就输出三个用个字符合二为一的个有理数则表示题目明确要求的排序。假如有多种答案,输出任意一组即可。输出样例51 05 26 62 16 1输出样例12 4 1 5 3-1-11 3 6 5 4 2

分析(Analysis)

显然把三个大的数插入到三个小的数之间就能够内部结构三个最大值。假设我们要内部结构个Peak,所以需要的大的数是个,而需要的小的数是个。而要恒定的大小不一关系就需要有约束条件:大的数中最小的数大于小的数中最大的数。因此有条件k+1">,因此有2k">。这种就搞定了。

核心代码(Code)

intn,k;cin>>n>>k;if(2*k>=n)puts("-1");else{for(inti=1,j=n;i<=k+1&&j>=n-k+1;i++,j--)cout<<i<<" "<<j<<" ";for(inti=k+1;i<n-k+1;i++)cout<<i<<" ";cout<<endl;}

B. AND Sequences

对三个有个非负有理数的字符串:,假如字符串满足条件:对任意的,字符串都满足:所以我们称这是三个好字符串。现取值三个字符串和它的大小不一。试找出负号的所有的排序方式,使得对应的字符串是好字符串。结果是排序方式的数目。数据可能会很大,输出对取模。输出文件格式第二行包涵三个有理数,则表示试验万萨县。对每一试验组的第二行,包涵三个有理数,则表示字符串的大小不一。每一试验组的第二行包涵个有理数,则表示字符串每一元素。题目保证对所有的试验组,的和不超过.输出文件格式输出行,第行输出第个试验组得到的好字符串的所有排序方式数目对取模。输出样例431 1 151 2 3 4 550 2 0 3 041 3 5 1输出样例60364

分析(Analysis)

对任意三个字符串:。定义前缀与后缀与依次为。根据好字符串的定义有:,即:。根据与运算的性质有:,。连接一下不等式:。再次根据定义有。因此有:以此类推,不难得到对任意的,都有:。因此要构成三个好字符串,必须有因此对都要满足上述的等式。因此我们只需要选择字符串中的最小的元素作为首尾(也是说每一与他们做运算的元素得到的一定是最小元素才能构成好字符串)不然就难以构成好字符串。显然的,最小的元素至少要有三个才行。

核心代码(Code)

intn,cnt=0;boolflag=true;cin>>n;vector<int>a(n);for(inti=0;i<n;i++)cin>>a[i];intamin=*min_element(a.begin(),a.end());for(intx:a){if(amin==x)cnt++;if((x&amin)!=amin){printf("0\n");flag=false;break;}}if(!flag)continue;intfact=1;for(inti=1;i<=n-2;i++)fact=(LL)fact*i%mod;intres=(LL)cnt*(cnt-1)%mod;res=(LL)res*fact%mod;printf("%d\n",res);

C. Add One

现取值三个有理数,明确要求对它进行次操作。对每一场操作,必须把有理数每一位上的数字用十进制下的来则表示。如:对1912进行一场操作后变为21023。试给出对操作次后的宽度。数据可能很大,需要对取模。输出文件格式第二行包涵三个有理数,则表示试验万萨县。对每一试验组,在一行中输出三个有理数。则表示初始和操作的次数输出文件格式对每三个试验组,输出最终数字的宽度对取模。输出样例51912 15 6999 188 212 100输出样例52642115

分析(Analysis)

一道DP题。考虑对10次操作。初始化:显然当,f[i] = 2,即对10的次操作结果都还是两位数。而时,,即:对10操作9次后变为109,是个三位数。所以对后的状态转移方程有:则表示进行次以上操作时即重复第一场操作后宽度和初始态宽度。如:,则表示对10进行10次操作的结果是对10进行一场操作和不操作的宽度和。(因为第九次时变为109,而109可以分为10和9)。因此我们就能先预处理出来对10的按位分解为的数字。后进行三个分类:

  1. 则表示这位数次操作后都没超过10,所以他的宽度就还是1.
  2. 则表示这位数次操作后大于10了,相当于对10进行操作。

最后对每一数字的结果求和取模就行了。

核心代码(Code)

for(inti=0;i<9;i++)f[i]=2;f[9]=3;for(inti=10;i<N;i++)f[i]=(LL)(f[i-9]+f[i-10])%mod;while(m--){intres=0;intn,k;cin>>n>>k;while(n){intt=n%10;if(t+k<10)res=(LL)(res+1)%mod;elseres=(LL)(res+f[t+k-10])%mod;n/=10;}cout<<res<<endl;}