QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#55639 | #4495. Shinobu loves trip | zzxzzx123 | AC ✓ | 2548ms | 60064kb | C++ | 1.4kb | 2022-10-14 21:25:45 | 2022-10-14 21:25:47 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+40,M=1010;
struct plan{
int s,d,infac;//表示的是s的逆元
bool operator<(const plan& a) const {
return d<a.d;
}
}q[M];
int x[M];
ll ksm(ll a,ll b,ll mod)
{
ll res=1;
while(b){
if(b&1)
res=res*a%mod;
a=a*a%mod;
b=b>>1;
}
return res;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int p,a,n,m;
map<int,int>mp;//手动初始化
scanf("%d%d%d%d",&p,&a,&n,&m);
int ma=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&q[i].s,&q[i].d);
if(!q[i].s) q[i].infac=1;
else q[i].infac=ksm(q[i].s,p-2,p);
ma=max(ma,q[i].d);
}
//答案为1的话一定是0
ll val=a%p;
for(int i=1;i<=ma;i++,val=val*a%p){
if(!mp[val])
mp[val]=i;//首先出现的话,否则的话就就不要了
}
sort(q+1,q+n+1);
for(int i=1;i<=m;i++){
scanf("%d",&x[i]);//开始进行操作
int cnt=0;
for(int j=1;j<=n;j++){
if(!x[i]){
if(!q[j].s){
cnt++;
}
continue;
}
if(!q[j].s) continue;//这个时候一定没有答案了啊
ll v=(ll)x[i]*q[j].infac%p;
if(v==1){
cnt++;
continue;//记得特判
}
// cout<<" ceil "<<v<<endl;
if(!mp[v]) continue;
// cout<<" debug "<<v<<" "<<mp[v]<<endl;
if(mp[v]<=q[j].d) cnt++;
}
printf("%d\n",cnt);
}
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 2548ms
memory: 60064kb
input:
5 999999937 4628 1000 1000 162585517 24584 407438671 108585 46973547 132178 142179754 23710 198067620 130706 829852550 190969 676555968 2127 717426372 80994 332054419 1078 471194333 66473 105470508 154839 939339406 89663 73289403 90982 529133484 198011 526081635 28219 405427868 174742 120011816 6408...
output:
167 166 168 168 174 169 2 167 169 22 153 169 150 163 7 152 149 166 166 176 63 178 125 170 94 167 155 173 56 147 163 169 167 183 78 165 179 173 182 170 166 150 152 166 169 169 169 173 162 52 180 182 170 163 173 173 175 150 171 166 170 148 170 166 63 168 172 151 150 72 129 14 61 167 167 169 174 133 17...
result:
ok 5000 lines