AtCoder Beginner Contest 162 solution

感覺降智了,比賽時最後兩題沒寫出來

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

AA

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

BB

簡單容斥/for 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);
}

我爲啥要打容斥原理呢,人類迷惑行爲

CC

莫比烏斯反演

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),但是何必呢?

DD

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;
}

EE

簡單容斥,比賽時沒想到.

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;
}

FF

f[i]f[i]表示ii個數中選擇i/2\lfloor i/2\rfloor個的最大和.

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章