結果

問題 No.2206 Popcount Sum 2
ユーザー tailstails
提出日時 2023-02-06 12:55:14
言語 C90
(gcc 11.4.0)
結果
AC  
実行時間 249 ms / 4,000 ms
コード長 2,385 bytes
コンパイル時間 613 ms
コンパイル使用メモリ 30,544 KB
実行使用メモリ 13,316 KB
最終ジャッジ日時 2023-09-18 00:43:21
合計ジャッジ時間 5,711 ms
ジャッジサーバーID
(参考情報)
judge12 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 5 ms
7,716 KB
testcase_01 AC 5 ms
7,604 KB
testcase_02 AC 34 ms
9,604 KB
testcase_03 AC 36 ms
9,660 KB
testcase_04 AC 36 ms
9,744 KB
testcase_05 AC 248 ms
12,976 KB
testcase_06 AC 249 ms
12,972 KB
testcase_07 AC 248 ms
13,076 KB
testcase_08 AC 247 ms
12,904 KB
testcase_09 AC 248 ms
13,000 KB
testcase_10 AC 206 ms
13,084 KB
testcase_11 AC 206 ms
13,120 KB
testcase_12 AC 206 ms
13,120 KB
testcase_13 AC 198 ms
13,264 KB
testcase_14 AC 197 ms
13,308 KB
testcase_15 AC 197 ms
13,316 KB
testcase_16 AC 161 ms
13,060 KB
testcase_17 AC 161 ms
13,068 KB
testcase_18 AC 161 ms
13,176 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.c: In function ‘f4’:
main.c:156:2: warning: implicit declaration of function ‘write’ [-Wimplicit-function-declaration]
  write(1,wp,wbuf+sizeof wbuf-wp);
  ^~~~~
main.c: In function ‘main’:
main.c:165:2: warning: implicit declaration of function ‘_exit’ [-Wimplicit-function-declaration]
  _exit(0);
  ^~~~~
main.c:165:2: warning: incompatible implicit declaration of built-in function ‘_exit’

ソースコード

diff #

#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")

#define getrp() ({char*mmap();mmap(0l,1l<<25,1,2,0,0ll);})
#define rd() ({long _v=0,_c;while(_c=*rp++-48,_c>=0)_v=_v*10+_c;_v;})
#define wt(v) ({ulong _z=v;do*--wp=_z%10+48;while(_z/=10);})
#define rep(v,e) for(long v=0;v<e;++v)
#define rrep(v,e) for(long v=e;v--;)

#define MD 998244353

typedef unsigned long ulong;

#define M 200002
int fac[M],ifac[M];

int inverse(int a){
	int b=MD;
	int u=1;
	int v=0;
	int s,t;
	while(b){
		t=a/b;
		s=b; b=a-t*b; a=s;
		s=v; v=u-t*v; u=s;
	}
	if(u<0){
		u+=MD;
	}
	return u;
}

void mkfac(){
	ulong x=1;
	fac[0]=x;
	for(long i=1;i<M;i++){
		x=x*i%MD;
		fac[i]=x;
	}
	x=inverse(x);
	for(long i=M;i--;){
		ifac[i]=x;
		x=x*i%MD;
	}
}

int p2[M],ip2[M];

void mkp2(){
	ulong x=1,y=1;
	for(long i=0;i<M;i++){
		p2[i]=x;
		x=x*2%MD;
		ip2[i]=y;
		y=y*(MD+1>>1)%MD;
	}
}

void radix_sort_aux(ulong*a,ulong*b,long n,int ph){
	int c[512];
	for(long i=0;i<512;++i){
		c[i]=0;
	}
	for(long i=0;i<n;++i){
		++c[a[i]&511];
	}
	int t=0;
	for(long i=0;i<512;++i){
		int u=c[i];
		c[i]=t;
		t+=u;
	}
	if(ph==0){
		for(long i=0;i<n;++i){
			b[c[a[i]&511]++]=a[i]>>9|a[i]<<55;
		}
	}else if(ph==1){
		for(long i=0;i<n;++i){
			b[c[a[i]&511]++]=a[i]>>18|a[i]<<46;
		}
	}else if(ph==2){
		for(long i=0;i<n;++i){
			b[c[a[i]&511]++]=a[i]>>37|a[i]<<27;
		}
	}
}

ulong q0[200000],q1[200000];
int r[200000];
char wbuf[1<<25];

void f0(){
	mkfac();
	mkp2();
}

long f1(){
	char*rp=getrp();
	long t=rd();
	rep(i,t){
		long n=rd()-1;
		long m=rd()-1;
		q0[i]=i<<36|n<<18|m;
	}
	return t;
}

void f2(long t){
	radix_sort_aux(q0,q1,t,0);
	radix_sort_aux(q1,q0,t,1);
	radix_sort_aux(q0,q1,t,2);
}

long f3(long t){
	long b=0,c=0;
	ulong z=1;

	rep(i,t){
		long j=q1[i]>>36;
		long e=q1[i]>>18&0x3ffff;
		long f=q1[i]&0x3ffff;
		if(f<c){
			z=ip2[b];
			c=0;
		}
		{
			long d=0;
			while(b<e){
				d=(d+MD-1ul*fac[b]*ifac[b-c]%MD)*2%MD;
				++b;
			}
			while(b>e){
				--b;
				d=(d*(MD+1>>1)+1ul*fac[b]*ifac[b-c])%MD;
			}
			z=(z+d*ifac[c]%MD*ip2[b+1])%MD;
		}
		{
			long d=0;
			while(c<f){
				++c;
				d+=1ul*ifac[c]*ifac[b-c]%MD;
			}
			z=(z+d%MD*fac[b]%MD*ip2[b])%MD;
		}
		r[j]=z*p2[b]%MD*(p2[b+1]-1)%MD;
	}
}

void f4(long t){
	char*wp=wbuf+sizeof wbuf;
	rrep(i,t){
		*--wp='\n';
		wt(r[i]);
	}
	write(1,wp,wbuf+sizeof wbuf-wp);
}

int main(){
	f0();
	long t=f1();
	f2(t);
	f3(t);
	f4(t);
	_exit(0);
}
0