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;
}
原文地址:https://www.cnblogs.com/F-T-Y/p/1300-2300-math.html