在第八个点(i=0∑∞Si=0)这一个点我的程序会 WA 是为什么?
# include <bits/stdc++.h>
# define int long long
//# define calc (x)
using namespace std;
const int N = 4e5 + 5 , mod = 1e9 + 7;
int n , m , q , sum[N] , nxt[N][65] , nxtpos[N][65];
int pos = -1,rpos = -1;
char s[N];
static inline void print (int x) {
if (x < 0) x = -x,putchar('-');
if (x >= 10) print(x / 10);
putchar(x % 10 + '0');
}
class Merge_Set {
public:
int s[N];
void init (int sz) { iota(s + 1 , s + sz + 1 , 1); }
int find (int x) { return s[x] == x?s[x]:s[x] = find(s[x]); }
void merge (int x , int y) { s[find(x)] = find(y); }
private:
} mq ;
static inline int calc (int x) { return x % n + ( x % n == 0 ) * n; }
void solve () {
int st , k, stt;
cin >> st >> k;
stt = st;
if (sum[n] == 0) return cout << (stt % mod + k % mod) % mod << "\n",void();//没有这一句是95分
st = calc(st);
int ans = 0;
for (int i = 63ll;i >= 0ll;--i) {
if ((k >> i) & 1ll) ans = (ans + nxt[st][i]) % mod , st = calc (nxtpos[st][i]);
}
cout << (stt % mod + ans % mod) % mod << "\n";
return void ();
}
signed main () {
// freopen("kingdom4.in","r",stdin);
// freopen("kingdom.out","w",stdout);
ios::sync_with_stdio(false);
cin >> n >> m >> q;
for (int i = 1;i <= n;++i) cin >> s[i];
for (int i = 1;i <= n;++i) sum[i] = sum[i - 1] + (s[i] == '1');
mq.init (n);
for (int i = n;i >= 1;--i) if (s[i] == '1') {pos = i ; break;}
rpos = pos;
for (int i = 1;i <= n;++i) {
if (s[i] == '0' && mq.find(i) == i) mq . merge (i , rpos);
else if (s[i] == '1') rpos = i;
}
for (int i = 1;i <= n;++i) {
int nex = calc(i + m) ;
if ((i + m < n && sum[nex] - sum[i] == 0) || (i + m > n && m < n && sum[i] - sum[nex] == sum[n] ) || (i + m > n && m >= n && sum[n] == 0)) {
nxt[i][0] = 1;
nxtpos[i][0] = calc (i + 1);
continue;
}
int step = (nex - mq.find(nex) < 0 ? nex + n - mq.find(nex) : nex - mq.find(nex));
nex = mq . find (nex) ;
nxt[i][0] = m - step;
nxt[i][0] %= mod;
nxtpos[i][0] = calc ( nex );
}
for (int bit = 1;bit <= 63;++bit) {
for (int i = 1;i <= n;++i) {
nxtpos[i][bit] = nxtpos[nxtpos[i][bit - 1]][bit - 1];
nxt[i][bit] = nxt[i][bit - 1] % mod + nxt[nxtpos[i][bit - 1]][bit - 1] % mod ;
nxt[i][bit] %= mod;
}
}
while (q -- > 0) solve ();
}