CF 1300-2300 数论
前言:太逊啦,都人均在切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('\n');}
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
顺着推肯定有后效性的,所有就倒着推,推到 \(n\geq 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('\n');}
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('\n');}
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('\n');}
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;
}