結果

問題 No.2206 Popcount Sum 2
ユーザー tails
提出日時 2023-02-06 12:55:14
言語 C90
(gcc 12.3.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,385 bytes
コンパイル時間 1,610 ms
コンパイル使用メモリ 27,520 KB
最終ジャッジ日時 2025-02-08 19:32:14
合計ジャッジ時間 3,776 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.c: In function 'mkfac':
main.c:36:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   36 |         for(long i=1;i<M;i++){
      |         ^~~
main.c:36:9: note: use option '-std=c99', '-std=gnu99', '-std=c11' or '-std=gnu11' to compile your code
main.c:41:18: error: redefinition of 'i'
   41 |         for(long i=M;i--;){
      |                  ^
main.c:36:18: note: previous definition of 'i' with type 'long int'
   36 |         for(long i=1;i<M;i++){
      |                  ^
main.c:41:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   41 |         for(long i=M;i--;){
      |         ^~~
main.c: In function 'mkp2':
main.c:51:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   51 |         for(long i=0;i<M;i++){
      |         ^~~
main.c: In function 'radix_sort_aux':
main.c:61:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   61 |         for(long i=0;i<512;++i){
      |         ^~~
main.c:64:18: error: redefinition of 'i'
   64 |         for(long i=0;i<n;++i){
      |                  ^
main.c:61:18: note: previous definition of 'i' with type 'long int'
   61 |         for(long i=0;i<512;++i){
      |                  ^
main.c:64:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   64 |         for(long i=0;i<n;++i){
      |         ^~~
main.c:68:18: error: redefinition of 'i'
   68 |         for(long i=0;i<512;++i){
      |                  ^
main.c:64:18: note: previous definition of 'i' with type 'long int'
   64 |         for(long i=0;i<n;++i){
      |                  ^
main.c:68:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   68 |         for(long i=0;i<512;++i){
      |         ^~~
main.c:74:17: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   74 |                 for(long i=0;i<n;++i){
      |                 ^~~
main.c:78:17: error: 'for' loo

ソースコード

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