全 WA 求调
查看原帖
全 WA 求调
464732
luqyou楼主2025/1/23 21:58

RT

思路是每个数每次 +pmodq+ p \bmod q 找环,然后预处理环上前缀和

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define fi first
#define sc second
#define pii pair<int,int>
#define pb push_back
#define umap unordered_map
#define mset multiset
#define pq priority_queue
#define ull unsigned long long
#define i128 __int128
const int maxn=1e6+10;
int p,q,n,m,t,cnt,a[maxn],b[maxn],vis[maxn],fl[maxn];
pii v[maxn];
vector<int> cyc[maxn],sum[maxn];
int Sum(int x,int s,int l){
    if(l==0) return 0;
    int sz=cyc[x].size();
    if(s+l-1<sz) return sum[x][s+l-1]-(s>0?sum[x][s-1]:0);
    return sum[x][sz-1]-(s>0?sum[x][s-1]:0)+sum[x][s+l-sz];
}
void solve(){
    cin>>p>>q>>n>>m>>t;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++) cin>>b[i];
    if(p>q) swap(p,q),swap(a,b),swap(n,m);
    for(int i=1;i<=m;i++) fl[b[i]]=1;
    for(int i=0;i<q;i++){
        if(vis[i]) continue;
        int num=i,step=0;
        cnt++;
        while(!vis[num]) cyc[cnt].pb(num),v[num]={cnt,step++},vis[num]=1,num=(num+p)%q;
    }
    for(int i=1;i<=cnt;i++){
        int sz=cyc[i].size();
        sum[i].resize(sz);
        for(int j=0;j<sz;j++) sum[i][j]=fl[cyc[i][j]]+(j?sum[i][j-1]:0);
    }
    int res=0;
    // for(int i=1;i<=cnt;i++,cout<<endl){
    //     for(int x:cyc[i]) cout<<x<<" ";
    // }
    for(int i=1;i<=n;i++){
        int sz=cyc[v[i].fi].size(),tmp=(t-a[i]-1);
        if(tmp<0) continue;
        tmp/=p;
        // cout<<a[i]<<" "<<tmp<<endl;
        res+=(tmp/sz)*sum[v[i].fi][sz-1]+Sum(v[i].fi,v[i].sc,tmp%sz);
    }
    cout<<res+1<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--) solve();
    return 0;
}
2025/1/23 21:58
加载中...