問題はこちら
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