首页 > 其他分享 >【CF】#844 div1 T1~T4复健

【CF】#844 div1 T1~T4复健

时间:2023-08-08 12:36:33浏览次数:40  
标签:复健 字符 844 互质数 T4 排列 引理 include 质数

高考结束,我的人生即将迈入新的阶段。记得哪位退役学长说的话,尽管努力不够,天赋不足,但走进大学校园,我仍将拾起键盘。

所以打了场cf比赛,没想到前几道题都不涉及算法板子,但断断续续做了好几天也才做了四个题。T5终于忍不住找了题解,一看是二分图可惜早已忘光,做不出来。

前四道题不涉及具体的算法,非常适合复健。

T1

题意大概为二人取数,每次取数可取a或者b个(a<b),没法取的人输掉。问最开始的数是多少的时候后手赢。

乍看是博弈论,实际上是文字游戏,因为先手一开始就取不到就算后手赢。。

所以,a>1的情况下答案就是1,a=1的时候答案就是2 。

T2

给出正整数1~n,其中要求尽可能多的存在mex为质数的区间(l,r),问如何排列。

这道题还蛮难想的,看到标签有数学想推导出什么结论,发现:

引理1:符合要求的序列必定包含1 引理2:越小的质数被包含的次数越少,贡献越大 引理3:越小的合数被包含的次数越多,贡献越大

情急之下只能贪心了,根据引理1,1一定在中心,然后直接让质数、合数分别根据贡献从外到内排列,最后处理奇偶问题。

没想到居然一次过了。

#include <cstdio>
#include <vector>
#include <cmath>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>

#define INF 2147483647
#define MAX 200005
//引理1:符合要求的序列必定包含1
//引理2:越小的质数被包含的次数越少,贡献越大
//引理3:越小的合数被包含的次数越多,贡献越大
//
//因此,可以试作如下策略:
//总使1在中间,将质数从两侧从小到大向中间排列
//然后,将合数从1两侧从小到大向两侧排列。

int prime[MAX],cnt;
bool isprime[MAX];
int n;

int ans[MAX];

void getprime(){
    for(int i = 2;i <= n;i ++){
        if(!isprime[i])
            prime[cnt++] = i;
        for(int j = 0; j < cnt && i*prime[j] <= n;j ++){
            isprime[i*prime[j]] = true;
            if(i % prime[j] == 0){
                break;
            }
        }

    }        

}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        memset(isprime,0,sizeof(isprime));
        cnt = 0;
        scanf("%d",&n);
        if(n == 1){
            printf("1\n");
            continue;
        }
        if(n == 2){
            printf("1 2\n");
            continue;
        }
        getprime();
        int side = 0;//0=left,1=right
        int pcnt[2] = {1,n};
        int mid = n/2+1;
        int npcnt[2] = {mid-1,mid+1};

        int pnum = 0;
        for(int i = 2; i <= n; i ++){
            if(!isprime[i]){
                pnum ++;
                ans[pcnt[side]] = i;
                if(side == 0)
                    pcnt[side] ++;
                else
                    pcnt[side] --;
            
                side = side^1;
            }
        }

        if(n%2 != 0 && pnum%2 != 0) side = 1;
        else if(n%2 != 0 && pnum%2 == 0) side = 0;
        else if(n%2 == 0 && pnum%2 != 0) side = 0;
        else if(n%2 == 0 && pnum%2 == 0) side = 0;

        for(int i = 4; i <= n; i ++){
            if(isprime[i]){
                ans[npcnt[side]] = i;
                if(side == 0)
                    npcnt[side] --;
                else
                    npcnt[side] ++;
            
                side = side^1;
            }
        }
        ans[mid] = 1;
        for(int i = 1; i<= n ; i++)
            printf("%d ",ans[i]);
        printf("\n");

    }    
    return 0;
}
code

打这段代码的时候手非常流畅,因为思考过很久,所以直接就实现出来了,一次报错都没有。

T3

给出长度为n的整数序列,可以对它其中一个元素进行如下操作:

删除它,然后将它两侧的元素合并相加为一个元素;如果它在序列一侧,那么只删除它。

若干次操作后,问你剩下的唯一一个元素的最大值。

看着好像是dp,但画了几个图发现,无论如何操作,最后剩下的那个元素的前身全部都是原序列中的奇次项,或全都是原序列中的偶次项。

所以事情就简单了,分别计算奇次项和偶次项的和,计算时把其中负的扔掉,注意如果全是负的答案就是0 。最后比较和的大小即可。

T4

给定一个字符串的长度n,n的所有因数为a1,a2,a3...,要求对于所有 ai * (n/ai)的矩阵,构造一个字符串,使得其中的字符按照从左到右从上到下的顺序填进矩阵时,没有相邻单元的字符相同。

看着很唬人,其实是个填色问题。要想让相邻的字符不同,最好的办法就是所有的排列错开。怎么办呢?先考虑简单的情况。

只考虑行之间的情况,

如果列数是奇数,那么两个不同字符交替排列即可错开。

如果列数是偶数,那么三个不同字符交替排列即可错开。

从以上情况发现,如果要列数为奇数、偶数的都错开,那么可以考虑与n的互质数。问题转化为求n的最小互质数。

考虑到字符最多只有26个,并且我打了个表发现,某数的最小互质数往往比它本身少若干数量级。

例如,要想让某数x的最小互质数是26,就需要x > 2*3*5*7*11*17*19*23。这远远超出题目所要求的10^6 。

所以,可以放心使用最小互质数个字符交替排列即可得到答案。

标签:复健,字符,844,互质数,T4,排列,引理,include,质数
From: https://www.cnblogs.com/dudujerry/p/17613847.html

相关文章

  • 【Java】从头开始的Java复健day3
    用的书:《Java从入门到精通》day1(3.1-3.3):【Java】从头开始的Java复健day1day2(3.4-3.8):【Java】从头开始的Java复健day2第四章流程控制4.1复合语句复合语句为局部变量创造了一个作用域在其中被定义的局部变量只能在该复合语句中被使用publicclassJava4_1{pu......
  • 【Java】从头开始的Java复健day2
    用的书:《Java从入门到精通》day1(3.1-3.3):【Java】从头开始的Java复健day1第三章Java语言基础3.4运算符赋值运算符=如果一个表达式中有两个以上的“=”,会从最右方的“=”开始处理算术运算符加法+减法-乘法*除法/(0不能当除数)取余%自增自减++a:先+1再使用a--a......
  • Telsa T4配置下用peft微调t5模型
    记录运行这个代码的过程:https://huggingface.co/docs/peft/task_guides/seq2seq-prefix-tuning环境配置虚拟环境python-Vcondacreate-npeft-practicepython=3.10.12condaactivatepeft-practice安装pytorchcondainstallpytorchtorchvisiontorchaudiopytorch-cu......
  • 配置 Sublime Text4为 C++ 编辑器的方法
    概述涉及以下插件的安装和配置PackageControl Terminus LSP LSP-clangd clang-format LSP-pyright LSP-json配置sublime安装PackageControl以进行包管理。Terminus安装Terminus以实现sublimetext4内的terminal。绑定快捷键:[ { "keys":[ "ctrl+shift+t" ], "com......
  • CT485modbus协议RS485接口开启合口式电流互感器传感器变送器
    www.daq-iot.com 19936624857—————————————————————————— SC-GP-CT485开口式电流互感器是上海数采物联网科技有限公司推出的一款可以把交流电模拟信号转换成485数字信号的一种电流传感器(互感器),产品内置32位ARM系列MCU和高精度计量芯片,经多点校......
  • Sublime Text4修改tab键为4个空格
    SublimeText4设置保存时自动将tab制表符替换为4个空格sublime编辑器虽然能够用来编写python脚本,但是它在代码格式化以及缩进上就是要自己去设置才可以了,因为python对于空格以及缩进是有严格要求的。下面介绍一下该如何在sublime编辑器中显示制表符和空格,以及修改tab键为4个空格的......
  • T4 模板: 为 ASP.NET MVC 开发人员快速入门指南
    http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx 在中提到我们的最近博客文章,ASP.NETMVC发布候选版,我们的代码生成功能(即,添加控制器和添加视图)现在使用T4(文本模板转换工具包)模板化技术在幕后。因为......
  • IBM ThinkPad T400 windows Vista sp1 官方恢复光盘(1CD+2DV
    http://www.nbbbs.com.cn/bbs/thread-12226-1-1.html IBMThinkPadT400windowsVistasp1官方恢复光盘(1CD+2DVD)下载1CD+2DVD版VISTA官方的恢复碟的纳米盘下载地址T400VISTABOOTCD下载地扯:T400vistaboot.nrgT400VISTA1DVDT400vista1.nrgT400VISTA2DVDT400vista2......
  • X61/T61/X200/T400/T500/W500/W700使用XP安装盘安装系统及驱动全攻略(
    X61/T61/X200/T400/T500/W500/W700使用XP安装盘安装系统及驱动全攻略(视频)X61T61X200T400T500W500W700使用XP装盘安装系统及驱动全攻略针对目前现有机器,有好多朋友都有说过不安在Thinkpad的机器上装系统,即使会装系统的话,有很多驱动也是搞不好。所以针对......
  • 【复健】线段树
    线段树复健OJ上的题还没做完,下午再说(你概念一种二叉搜索树,通过二叉树形结构储存数据,能够解决大部分与区间操作有关的问题,当然应用范围不止于区间操作。原理是用二分(?)维护一定的区间。主体部分实现建树考虑递归建树,一直二分直到只剩一个数据为止。展开代码inlinevoidpu......