QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#18301#983. The Hash TableJohnAlfnov#AC ✓149ms3952kbC++142.8kb2022-01-17 16:03:412022-05-04 17:47:25

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-04 17:47:25]
  • 评测
  • 测评结果:AC
  • 用时:149ms
  • 内存:3952kb
  • [2022-01-17 16:03:41]
  • 提交

answer

#include<bits/stdc++.h>
#define li long long
#define l_l long long
using namespace std;
const li i_1=1;
const l_l i_2=1;
inline l_l xqz(l_l a,l_l b){
	return (a-(a%b+b)%b)/b;
}
li di(l_l a,l_l b,l_l c,l_l n){
	if(n==0)return xqz(b,c);
	l_l am=a%c+c,bm=b%c+c;
	if(am>=c)am-=c;
	if(bm>=c)bm-=c;
	if(a==am&&b==bm){
		if(a==0)return 0;
		l_l m=(i_1*a*n+b)/c;
		return i_1*n*m-di(c,c-b-1,a,m-1);
	}
	l_l ay=(a-am)/c,by=(b-bm)/c;
	li ans=i_1*n*(n+1)/2*ay+i_1*(n+1)*by;
	return ans+di(am,bm,c,n);
}
inline li d(l_l a,l_l b,l_l c,l_l n){
	return di(a,b,c,n)-xqz(b,c);
}
l_l gcd(l_l a,l_l b){
	return b==0?a:gcd(b,a%b);
}
l_l lcm(l_l a,l_l b){
	return a/gcd(a,b)*b;
}
li f(l_l a,l_l b,l_l n){
	--n;
	if(n==1)return (a==1&&b==1);
	l_l L,R;
	li ans=n/lcm(a,b);
	if((a&1)){
		l_l ll,rr;
		if((b&1)){
			L=1/a+1,R=(n+1)/a;
			ll=(L-1)/2+1,rr=R/2;
			if(ll<=rr)ans+=d(2*a,-2,2*b,rr)-d(2*a,-2,2*b,ll-1);
			ll=L/2,rr=(R+1)/2-1;
			if(ll<=rr)ans+=d(2*a,a+b-2,2*b,rr);
			if(ll<=rr)ans-=d(2*a,a+b-2,2*b,ll-1);
			L=(n+1)/a+1,R=2*n/a;
			ll=(L-1)/2+1,rr=R/2;
			if(ll<=rr)ans+=d(-2*a,2*n,2*b,rr)-d(-2*a,2*n,2*b,ll-1);
			ll=L/2,rr=(R+1)/2-1;
			if(ll<=rr)ans+=d(-2*a,2*n+b-a,2*b,rr);
			if(ll<=rr)ans-=d(-2*a,2*n+b-a,2*b,ll-1);
			return ans;
		}else{
			L=1/a+1,R=(n+1)/a;
			ll=(L-1)/2+1,rr=R/2;
			if(ll<=rr)ans+=d(2*a,-2,b,rr)-d(2*a,-2,b,ll-1);
			L=(n+1)/a+1,R=2*n/a;
			ll=(L-1)/2+1,rr=R/2;
			if(ll<=rr)ans+=d(-2*a,2*n,b,rr)-d(-2*a,2*n,b,ll-1);
			return ans;
		}
	}else{
		if((b&1)){
			L=1/a+1,R=(n+1)/a;
			if(L<=R)ans+=d(a,-2,2*b,R)-d(a,-2,2*b,L-1);
			L=(n+1)/a+1,R=2*n/a;
			if(L<=R)ans+=d(-a,2*n,2*b,R)-d(-a,2*n,2*b,L-1);
			return ans;
		}else{
			L=1/a+1,R=(n+1)/a;
			if(L<=R)ans+=d(a,-2,b,R)-d(a,-2,b,L-1);
			L=(n+1)/a+1,R=2*n/a;
			if(L<=R)ans+=d(-a,2*n,b,R)-d(-a,2*n,b,L-1);
			return ans;
		}
	}
	return -1;
}
const int A=35000;
const int B=12;
int s[A+5],dd[A+5],tt=0;
int n,m,pr[B+5],zs[B+5],gs;
int xa[B+5],xb[B+5];
l_l ans;
void print(){
	s[1]=1;
	for(int i=2;i<=A;++i){
		if(!s[i])dd[++tt]=i;
		for(int j=1;j<=tt&&i*dd[j]<=A;++j){
			s[i*dd[j]]=1;
			if(i%dd[j]==0)break;
		}
	}
}
void dfs(int stp){
	if(stp>gs){
		int r=1;
		l_l l1=1,l2=1;
		for(int i=1;i<=gs;++i){
			for(int j=1;j<=xa[i];++j)l1*=pr[i];
			for(int j=1;j<=xb[i];++j)l2*=pr[i];
			if(xa[i]+xb[i]!=zs[i])r=-r;
		}
		ans+=r*f(l1,l2,n);
		return;
	}
	for(int i=0;i<=zs[stp];++i)
		for(int j=zs[stp]-i;j<=zs[stp]-i+1;++j){
			if(j>zs[stp])break;
			xa[stp]=i,xb[stp]=j;
			dfs(stp+1);
		}
}
signed main(){
	print();
	int T;
	cin>>T;
	while(T--){
		gs=0;
		cin>>n>>m;
		for(int i=1;i<=tt;++i)if(m%dd[i]==0){
			pr[++gs]=dd[i];
			zs[gs]=1;
			m/=dd[i];
			while(m%dd[i]==0)++zs[gs],m/=dd[i];
		}
		if(m!=1){
			pr[++gs]=m;
			zs[gs]=1;
		}
		ans=0;
		dfs(1);
		printf("%lld\n",ans);
	}
	return (signed)0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 3772kb

input:

3
5 4
1234 5678
5 4

output:

4
229
4

result:

ok 3 tokens

Test #2:

score: 0
Accepted
time: 3ms
memory: 3892kb

input:

5
919191919 998244353
919191919 308308924
124312512 700980343
199712020 199712020
1000000000 1000000000

output:

420069742
18975162173
34523625
619107226
36400000000

result:

ok 5 tokens

Test #3:

score: 0
Accepted
time: 3ms
memory: 3848kb

input:

5
351177178 2
236814804 3
406487669 4
107706571 5
206252441 6

output:

30831352411422332
15578125268692158
41308056059019556
2088126907497711
5908342860201211

result:

ok 5 tokens

Test #4:

score: 0
Accepted
time: 108ms
memory: 3896kb

input:

5
795965436 698377680
775372176 735134400
891189723 555660000
255414898 555660000
649803503 967458816

output:

252131828509
252898591532
196092107465
16019483439
23110007395

result:

ok 5 tokens

Test #5:

score: 0
Accepted
time: 149ms
memory: 3728kb

input:

5
980056074 669278610
786804145 536870912
94743614 669278610
925596206 551350800
277753133 735134400

output:

151494104505
16332684795
1386109471
391665329539
32367779875

result:

ok 5 tokens

Test #6:

score: 0
Accepted
time: 146ms
memory: 3952kb

input:

5
407928831 901800900
959460685 551350800
929921323 901800900
880362378 551350800
169887581 551350800

output:

24176516170
420863755861
126194540248
354298688005
13128893811

result:

ok 5 tokens

Test #7:

score: 0
Accepted
time: 1ms
memory: 3772kb

input:

5
755923335 903960666
248398318 89883150
32020160 729647777
48000958 745177909
261977197 120541067

output:

5122927135
10499768724
1250410
5736978
980686184

result:

ok 5 tokens

Test #8:

score: 0
Accepted
time: 1ms
memory: 3792kb

input:

5
120618885 904615503
860299168 970357266
2922308 99586084
116144876 802899228
621873179 98196855

output:

72362680
1890408813
77476
180492837
23279216759

result:

ok 5 tokens

Test #9:

score: 0
Accepted
time: 4ms
memory: 3932kb

input:

5
337929091 905270340
472298323 850733078
973824456 50926103
184354331 860587779
981801929 75885412

output:

2695205304
791722210
18137207967
13641011
50173808550

result:

ok 5 tokens

Test #10:

score: 0
Accepted
time: 6ms
memory: 3808kb

input:

5
725900160 906132534
140660629 407214962
935092856 84357639
706890499 221743500
461717852 516104007

output:

3448528660
288899219
61675795925
96294825272
475220310

result:

ok 5 tokens

Test #11:

score: 0
Accepted
time: 1ms
memory: 3864kb

input:

5
943210366 906787371
752627016 287590774
905995005 183214075
775132721 279464819
821646602 493792564

output:

11587484479
1606204266
21788486368
3802176853
10347608659

result:

ok 5 tokens

Test #12:

score: 0
Accepted
time: 3ms
memory: 3892kb

input:

5
943210366 900720143
752627016 900720143
905995005 942060233
775132721 942060233
821646602 962178361

output:

1522977645
931104902
1306217667
941841841
691366758

result:

ok 5 tokens