AtCoder Beginner Contest 162 solution

本文分享了算法竞赛的实战经验,解析了包括容斥原理、莫比乌斯反演等在内的多种算法应用案例,深入探讨了算法设计与优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感觉降智了,比赛时最后两题没写出来

真的是普及难度,我下次一定要AK and 涨Rating(咕咕咕)

AAA

int n; qr(n);
while(n) {
    if(n%10==7) {puts("Yes");return 0;}
    n/=10;
}puts("No");

BBB

简单容斥/for for forfor ~for~ forfor for for

ll n,ans;

ll f(ll x) {
	return (x+1)*x>>1;
}

int main() {
	qr(n); 
	ans=f(n)+15*f(n/15)-3*f(n/3)-5*f(n/5);
	pr2(ans);
	return 0;
}
ll n,ans;

int main() {
    qr(n);
    for(int i=1;i<=n;i++)
        ans+=(i%3!=0&&i%5!=0)*i;
   	pr2(ans);
}

我为啥要打容斥原理呢,人类迷惑行为

CCC

莫比乌斯反演

ll ans,n;

int gcd(int x,int y) {return !x?y:gcd(y%x,x);}

int main() {
	qr(n); 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++) {
			int k=gcd(i,j);
			for(int l=1;l<=n;l++)
				ans+=gcd(k,l);
		}
	pr2(ans);
	return 0;
}

其实开个桶可以实现O(n2)O(n^2)O(n2),但是何必呢?

DDD

int n,sum[5][N],ys[150];
ll ans;
char s[N];

int main() {
	qr(n); scanf("%s",s+1);
	ys['R']=1;ys['G']=2; ys['B']=3;
	for(int i=1;i<=n;i++) {
		sum[1][i]=sum[1][i-1];
		sum[2][i]=sum[2][i-1];
		sum[3][i]=sum[3][i-1];
		sum[ys[s[i]]][i]++;
	}
	for(int i=1;i<n;i++)
		for(int j=i+1,k;j<n;j++) if(s[i]^s[j]) {
			k=j*2-i;
			ans+=sum[6-ys[s[i]]-ys[s[j]]][n]-
				 sum[6-ys[s[i]]-ys[s[j]]][j]-
				 (ys[s[k]]==6-ys[s[i]]-ys[s[j]]);
		}
	pr2(ans);
	return 0;
}

EEE

简单容斥,比赛时没想到.

int n,m,f[N]; ll ans;
void upd(int &x) {x+=x>>31&mod;}
ll power(ll a,ll b=n) {
	ll c=1;
	while(b&&a>1) {
		if(b&1) c=c*a%mod;
		b=b/2;  a=a*a%mod;
	}
	return c;
}

int main() {
	qr(n); qr(m);
	for(int i=m; i;i--) {
		f[i]=power(m/i,n);
		for(int j=i*2;j<=m;j+=i) upd(f[i]-=f[j]);
		ans+=(ll)f[i]*i%mod;
	}
	pr2(ans%mod);return 0;
}

FFF

f[i]f[i]f[i]表示iii个数中选择⌊i/2⌋\lfloor i/2\rfloori/2个的最大和.

int n,a[N];
ll f[N],s[N];

int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%d",&a[i]);
		s[i]=(i>1?s[i-2]:0)+a[i];
	}
	for(int i=2;i<=n;i++)
		if(i&1) f[i]=max(f[i-1],f[i-2]+a[i]);
		else f[i]=max(s[i-1],f[i-2]+a[i]);
	printf("%lld\n",f[n]);return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Infinite_Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值