QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#18300 | #983. The Hash Table | qingyu_orz | AC ✓ | 154ms | 3892kb | C++14 | 2.8kb | 2022-01-17 16:03:14 | 2022-05-04 17:47:22 |
Judging History
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;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3800kb
input:
3 5 4 1234 5678 5 4
output:
4 229 4
result:
ok 3 tokens
Test #2:
score: 0
Accepted
time: 2ms
memory: 3864kb
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: 1ms
memory: 3800kb
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: 112ms
memory: 3860kb
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: 154ms
memory: 3864kb
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: 143ms
memory: 3860kb
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: 3808kb
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: 3892kb
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: 3892kb
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: 4ms
memory: 3844kb
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: 4ms
memory: 3808kb
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: 1ms
memory: 3868kb
input:
5 943210366 900720143 752627016 900720143 905995005 942060233 775132721 942060233 821646602 962178361
output:
1522977645 931104902 1306217667 941841841 691366758
result:
ok 5 tokens