読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.146 試験監督(1)

問題はこちら
No.146 試験監督(1) - yukicoder

椅子がC個あるときに座れる人数は
Cが偶数の時C/2
Cが奇数の時(C+1)/2となる
これはfloor((C+1)/2)とまとめられるので、これにより計算すれば良い

int main(){
	long n,a,b,s=0,m=1000000007;
	scanf("%d",&n);
	while(n--){
		scanf("%ld%ld",&a,&b);
		a=(a+1)/2;
		s=(s+a%m*(b%m))%m;
	}
	printf("%d",s); 
	return 0;
}

a+1は-~aだったのでこれを利用して

a=(a+1)/2;
s=(s+a%m*(b%m))%m;
//これは
s=(s-~a/2%m*(b%m))%m;
//こう書ける。後の都合で2つにバラして
s-=~a/2%m*(b%m);s%=m;
//とする

あとはいつもどおりやって

long a,b,s,x=1e9+7;
main(){
	for(gets(&a);~scanf("%ld%ld",&a,&b);s%=x)s-=~a/2%x*(b%x);
	a=!printf("%d",s);
}

…と思わせて、これも前回と同様に短縮できる

long a,b,s,x=1e9+7;
main(i){
	for(;~scanf("%ld",&b);a=b)i++%2?s=(s-~a/2%x*(b%x))%x:0;
	a=!printf("%d",s);
}

1B短縮して101B

17/01/23追記
bからaに値を渡す時点で加工しておけばカッコが外せる

long a,b,s,x=1e9+7;
main(i){
	for(;~scanf("%ld",&b);a=~b/2%x)i++%2?s=(s-b%x*a)%x:0;
	a=!printf("%d",s);
}

99B