解题

    技术2024-05-22  71

    题目链接:解题


    因为不要的是变成0,所以我们其实是找到最早出现的一个区间,这个区间的和%m==0

    那么其实找两个最近的 a[i]%m == k && a[j]%m == k

    哈希记录即可。

    由于鸽巢原理,并且有解,所以不可能遍历超过m+1次,所以复杂度是ok的。


    AC代码:

    #pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> //#define int long long using namespace std; const int N=1e6+10,M=5e7+10; int n,q,vis[M],mod,now,x; char str[N]; inline void solve(){ cin>>mod; now=0; vis[0]=n; x=1; for(int i=1;i<=mod;i++) vis[i]=0; for(int i=n;i>=1;i--){ now=(now+(str[i]-'0')*x%mod)%mod; x=x*10%mod; if(vis[now]) return cout<<i<<' '<<vis[now]<<'\n',void(); vis[now]=i-1; } } signed main(){ scanf("%s",str+1); n=strlen(str+1); cin>>q; while(q--) solve(); return 0; }
    Processed: 0.014, SQL: 9