• CF 1300-2300 数论


    Link

    前言:太逊啦,都人均在切3000+的题,就我……

    刚刚开始做……要持续更个一个月吧qwq

    T1 230B T-primes

    https://www.luogu.com.cn/problem/CF230B

    奇数个不同的正整数因数,很明显,是完全平方数。而且 (sqrt{x}) 也得是一个质数。

    注意开 (longlong)

    #include<iostream>
    #include<cstdio>
    #include<string.h>
    #include<math.h>
    using namespace std;
    #define int long long
    #define FOR(i,a,b) for(int i=a;i<=b;i++)
    #define REP(i,a,b) for(int i=a;i>=b;i--)
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    inline void write(int x)
    {
        if(x<0) putchar('-'),write(-x);
        else{if(x>9)write(x/10);putchar('0'+x%10);}
    }
    inline void writeputs(int x){write(x),putchar('
    ');}
    inline void writeputchar(int x){write(x),putchar(' ');}
    int t,ans_prime[100005],tot_prime;
    bool if_prime[1000005];
    void pre_prime(int x)
    {
        memset(if_prime,1,sizeof if_prime);
        if_prime[1]=0;
        FOR(i,2,x)
        {
            if(if_prime[i]) ans_prime[++tot_prime]=i;
            FOR(j,1,tot_prime)
            {
                int y=i*ans_prime[j],z=i%ans_prime[j];
                if(y>x) break;
                if_prime[y]=0;
                if(z==0) break;
            }
        }
    }
    signed main()
    {
        pre_prime(1000000);
        t=read();
        while(t--)
        {
            int x=read(),y=sqrt(x);
            if(!if_prime[y])
            {
                puts("NO");
                continue;
            }
            if(pow(y,2)==x)
            {
                puts("YES");
                continue;
            }
            puts("NO");
        }
        return 0;
    }
    

    T2 520B Two Buttons

    https://www.luogu.com.cn/problem/CF520B

    顺着推肯定有后效性的,所有就倒着推,推到 (ngeq m)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define FOR(i,a,b) for(int i=a;i<=b;i++)
    #define REP(i,a,b) for(int i=a;i>=b;i--)
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    inline void write(int x)
    {
        if(x<0) putchar('-'),write(-x);
        else{if(x>9)write(x/10);putchar('0'+x%10);}
    }
    inline void writeputs(int x){write(x),putchar('
    ');}
    inline void writeputchar(int x){write(x),putchar(' ');}
    int n,m,ANS;
    int main()
    {
        n=read(),m=read();
        while(m>n)
        {
            if(m%2==1) m++;
            else m/=2;
            ANS++;
        }
        write(ANS+n-m);
        return 0;
    }
    

    T3 478B Random Teams

    https://www.luogu.com.cn/problem/CF478B

    先判 (m > n) 以防万一。
    分组为 (1,1,……,n-m)(max)
    分组为平均的为 (min)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define int long long
    #define FOR(i,a,b) for(int i=a;i<=b;i++)
    #define REP(i,a,b) for(int i=a;i>=b;i--)
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    inline void write(int x)
    {
        if(x<0) putchar('-'),write(-x);
        else{if(x>9)write(x/10);putchar('0'+x%10);}
    }
    inline void writeputs(int x){write(x),putchar('
    ');}
    inline void writeputchar(int x){write(x),putchar(' ');}
    int n,m;
    signed main()
    {
        n=read(),m=read();
        if(m>n)
        {
            write(0);
            return 0;
        }
        int x=n-m;
        int ANS2=(1+x)*x/2;
        int a=n%m;
        int y=n/m;
        int b=m-a;
        int ANS1=(y-1)*y/2*b+(y+1)*y/2*a;
        writeputchar(ANS1),write(ANS2);
        return 0;
    }
    

    T4 1328B K-th Beautiful String

    https://www.luogu.com.cn/problem/CF1328B

    所以我们可以从后到前枚举第一个 (b) 的位置,假设当前位置是 (i),那么这一种情况就有 (n-i) 个字符串
    如果 (k>n-i),那么 (k→k−(n−i))
    其他情况,第 (k) 个字符串就在这 (n−i) 个,那么第二个 (b) 就是在第 (n-k+1) 个。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define FOR(i,a,b) for(int i=a;i<=b;i++)
    #define REP(i,a,b) for(int i=a;i>=b;i--)
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    inline void write(int x)
    {
        if(x<0) putchar('-'),write(-x);
        else{if(x>9)write(x/10);putchar('0'+x%10);}
    }
    inline void writeputs(int x){write(x),putchar('
    ');}
    inline void writeputchar(int x){write(x),putchar(' ');}
    int t,n,k;
    int main()
    {
        t=read();
        while(t--)
        {
    	n=read(),k=read();
    	REP(i,n-1,i)
    	{
    	    if(k>n-i) k-=n-i;
    	    else
    	    {
    		FOR(j,1,i-1) putchar('a');
    		putchar('b');
    		FOR(j,i+1,n-k) putchar('a');
    		putchar('b');
    		FOR(j,n-k+2,n) putchar('a');
    		puts("");
    		break;
    	    }
    	}
        }
        return 0;
    }
    

    T5 550C Divisibility by Eight

    https://www.luogu.com.cn/problem/CF550C

    一个数想被 (8) 整除,末尾 (3) 个数一定是 (8) 的倍数

    #include<cstdio>
    #include<string.h>
    using namespace std;
    #define FOR(i,a,b) for(int i=a;i<=b;i++)
    #define REP(i,a,b) for(int i=a;i>=b;i--)
    inline void write(int x)
    {
        if(x<0) putchar('-'),write(-x);
        else{if(x>9)write(x/10);putchar('0'+x%10);}
    }
    inline void writeputchar(int x)
    {
        write(x);putchar(' ');
    }
    char s[105];
    int main(int argc, char const *argv[])
    {
        scanf("%s",s+1);
        int len=strlen(s+1);
        FOR(i,1,len)
        {
            FOR(j,i+1,len)
    	{
    	    FOR(k,j+1,len)
    	    {
    	        if(((s[i]-'0')*100+(s[j]-'0')*10+s[k]-'0')%8==0)
    	        {
    		    puts("YES");
    		    write(((s[i]-'0')*100+(s[j]-'0')*10+s[k]-'0'));
    		    return 0;
    	        }
                }
                if(((s[i]-'0')*10+s[j]-'0')%8==0)
    	    {
                    puts("YES");
    		write(((s[i]-'0')*10+s[j]-'0'));
    		return 0;
    	    }
    	}
    	if((s[i]-'0')%8==0)
    	{
    	    puts("YES");
    	    write(s[i]-'0');
    	    return 0;
    	}
        }
        puts("NO");
        return 0;
    }
    
  • 相关阅读:
    Python实现简单中文词频统计示例
    Python组合类型笔记
    Python中turtle绘图学习笔记和实例
    Python爬虫入门
    与Python的第一次见面
    Delphi开发人员指南 第一部份快速开发的基础 第1章 Delphi下的Windows编程(四)
    Delphi开发人员指南 第一部份快速开发的基础 第1章 Delphi下的Windows编程(三)
    Delphi开发人员指南 第一部份快速开发的基础 第1章 Delphi下的Windows编程(二)
    Delphi开发人员指南 第一部份快速开发的基础 第1章 Delphi下的Windows编程(一)
    Java开发环境安装 配置 与 Eclipse安装 新建Project
  • 原文地址:https://www.cnblogs.com/F-T-Y/p/1300-2300-math.html
Copyright © 2020-2023  润新知