結果

問題 No.990 N×Mマス計算(Kの倍数)
ユーザー tailstails
提出日時 2021-06-29 18:00:29
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 40 ms / 2,000 ms
コード長 3,049 bytes
コンパイル時間 1,094 ms
コンパイル使用メモリ 33,904 KB
実行使用メモリ 4,644 KB
最終ジャッジ日時 2023-09-08 03:00:43
合計ジャッジ時間 3,839 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 0 ms
4,376 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 0 ms
4,376 KB
testcase_03 AC 0 ms
4,376 KB
testcase_04 AC 0 ms
4,376 KB
testcase_05 AC 1 ms
4,380 KB
testcase_06 AC 0 ms
4,376 KB
testcase_07 AC 1 ms
4,376 KB
testcase_08 AC 1 ms
4,380 KB
testcase_09 AC 1 ms
4,380 KB
testcase_10 AC 5 ms
4,376 KB
testcase_11 AC 7 ms
4,376 KB
testcase_12 AC 40 ms
4,376 KB
testcase_13 AC 5 ms
4,376 KB
testcase_14 AC 8 ms
4,380 KB
testcase_15 AC 5 ms
4,380 KB
testcase_16 AC 6 ms
4,380 KB
testcase_17 AC 4 ms
4,380 KB
testcase_18 AC 39 ms
4,380 KB
testcase_19 AC 23 ms
4,376 KB
testcase_20 AC 9 ms
4,644 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.c:104:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
  104 | main(){
      | ^~~~
main.c: 関数 ‘main’ 内:
main.c:194:9: 警告: 関数 ‘write’ の暗黙的な宣言です [-Wimplicit-function-declaration]
  194 |         write(1,wp,wbuf+sizeof wbuf-wp);
      |         ^~~~~
main.c:195:9: 警告: implicit declaration of function ‘_exit’; did you mean ‘_Exit’? [-Wimplicit-function-declaration]
  195 |         _exit(0);
      |         ^~~~~
      |         _Exit

ソースコード

diff #

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

char*mmap();
#define rd(v) long v=0;{int _c;while(_c=*rp++-48,_c>=0)v=v*10+_c;}
#define wt(v) {long _z=v;do*--wp=_z%10+48;while(_z/=10);}
#define rep(v,e) for(long v=0;v<e;++v)

#define SIEVE_N 32000
int nprimes;
int primes[SIEVE_N];
char sieve[SIEVE_N];

void mkprimes(){
	primes[nprimes++]=2;
	for(int i=3;i<SIEVE_N;i+=2){
		if(sieve[i]==0){
			primes[nprimes++]=i;
			for(int j=i*i;j<SIEVE_N;j+=i*2){
				sieve[j]=1;
			}
		}
	}
}

int divisors(int a,int*divs){
	int n=0;
	divs[n++]=1;
	int i=0;
	int p;
	while(p=primes[i],a>=p*p){
		if(a%p==0){
			int k=1;
			while(a/=p,a%p==0){
				++k;
			}
			int n0=n*k;
			for(int j=0;j<n0;++j){
				divs[n++]=divs[j]*p;
			}
		}
		++i;
	}
	if(a>1){
		int n0=n;
		for(int j=0;j<n0;++j){
			divs[n++]=divs[j]*a;
		}
	}
	return n;
}

void radix_sort_aux(unsigned*a,unsigned*b,int n){
	int c[256];
	for(int i=0;i<256;++i){
		c[i]=0;
	}
	for(int i=0;i<n;++i){
		++c[a[i]&255];
	}
	int t=0;
	for(int i=0;i<256;++i){
		int u=c[i];
		c[i]=t;
		t+=u;
	}
	for(int i=0;i<n;++i){
		b[c[a[i]&255]++]=a[i]>>8|a[i]<<24;
	}
}

int rsbuf[100000];
void radix_sort(unsigned*a,int n){
	radix_sort_aux(a,rsbuf,n);
	radix_sort_aux(rsbuf,a,n);
	radix_sort_aux(a,rsbuf,n);
	radix_sort_aux(rsbuf,a,n);
}

long gcd(long a,long b){
	if(a==0||b==0){
		return a+b;
	}
	long x=__builtin_ctzl(a);
	long y=__builtin_ctzl(b);
	a>>=x;
	b>>=y;
	long c;
	while(c=a-b){
		c>>=__builtin_ctzl(c);
		if(c<0){
			b=-c;
		}else{
			a=c;
		}
	}
	return a<<(x<=y?x:y);
}

int sa[100000],sb[100000];
int kdivs[1500];
int ha[1500],hb[1500];

main(){
	char*rp=mmap(0l,1l<<25,1,2,0,0ll);
	rd(n);
	rd(m);
	rd(k);
	int op=*rp;
	rp+=2;
	long ans=0;
	if(op=='+'){
		rep(i,m){
			rd(bi);
			sb[i]=bi%k;
		}
		radix_sort(sb,m);
		rep(i,n){
			rd(ai);
			ai=(k-ai)%k;
			sa[i]=ai+(ai<0?k:0);
		}
		radix_sort(sa,n);
		long i=0,j=0;
		while(i<n&&j<m){
			if(sa[i]<sb[j]){
				++i;
			}else if(sa[i]>sb[j]){
				++j;
			}else{
				int v=sa[i];
				long di=0,dj=0;
				while(i<n&&sa[i]==v) ++i,++di;
				while(j<m&&sb[j]==v) ++j,++dj;
				ans+=di*dj;
			}
		}
	}else{
		mkprimes();
		long kdivn=divisors(k,kdivs);
		radix_sort(kdivs,kdivn);
		rep(i,m){
			rd(b);
			b=gcd(k,b);
			long lo=0,hi=kdivn;
			while(lo<hi-1){
				long mid=lo+hi>>1;
				if(b<kdivs[mid]){
					hi=mid;
				}else{
					lo=mid;
				}
			}
			hb[lo]+=1;
		}
		rep(i,n){
			rd(a);
			a=gcd(k,a);
			long lo=0,hi=kdivn;
			while(lo<hi-1){
				long mid=lo+hi>>1;
				if(a<kdivs[mid]){
					hi=mid;
				}else{
					lo=mid;
				}
			}
			ha[lo]+=1;
		}
		long keb=__builtin_ctzl(k);
		k>>=keb;
		unsigned long ket=~0ul/k;
		unsigned long ked=k;
		ked*=2-k*ked;
		ked*=2-k*ked;
		ked*=2-k*ked;
		ked*=2-k*ked;
		ked*=2-k*ked;
		rep(i,kdivn){
			rep(j,kdivn){
				long x=(long)kdivs[i]*(long)kdivs[j];
				long xb=__builtin_ctzl(x);
				if(xb>=keb){
					x>>=xb;
					if(x*ked<=ket){
						ans+=(long)ha[i]*(long)hb[j];
					}
				}
			}
		}
	}
	char wbuf[64],*wp=wbuf+sizeof wbuf;
	wt(ans);
	write(1,wp,wbuf+sizeof wbuf-wp);
	_exit(0);
}
0