Reading

CodeForces 1045B Space Isaac


Fanyi Pu

ๅŽŸ้ข˜้“พๆŽฅ

0โˆผmโˆ’1 ็š„ๆ•ฐ่ขซๅˆ†ๆˆไธคไธช้›†ๅˆ๏ผŒไฝ ๅฏไปฅๅˆ†ๅˆซไปŽไธคไธช้›†ๅˆไธญๅ–ไธ€ไธชๆ•ฐ็›ธๅŠ ๅนถๅฏน m ๅ–ๆจก๏ผŒๆฑ‚ 0โˆผmโˆ’1 ไธญไธ่ƒฝๆž„้€ ๅ‡บ็š„ๆ•ฐใ€‚

้ข˜่งฃ

ๆ„Ÿ่ง‰ๅฆ‚ๆžœsxd666ๆฅๅš่ฟ™้ข˜่‚ฏๅฎš่ƒฝไธ€็œผ็ง’๏ผŒ็„ถ่€Œไป–ๆญฃๅฟ™็€ๅˆ‡ๅ…ถไป–้ข˜ใ€‚

้ฆ–ๅ…ˆๆˆ‘ไปฌๅ‘็Žฐๅฆ‚ๆžœ่ฆ่ฎฉ a+bโ‰กx(modm)โ€‹๏ผŒๅฆ‚ๆžœๅทฒ็Ÿฅ a,xโ€‹๏ผŒ้‚ฃ bโ€‹ ไธ€ๅฎšๆ˜ฏๅ”ฏไธ€็š„ใ€‚ไนŸๅฐฑๆ˜ฏ่ฏด๏ผŒๅ‡่ฎพ็ป™ๅฎš้›†ๅˆๆ˜ฏ Aโ€‹๏ผŒไธŽไน‹ๅฏนๅบ”็š„้›†ๅˆไธบ Bโ€‹๏ผŒๅฆ‚ๆžœๆœ‰ aโˆˆAโ€‹ ไฝ†ๆ‰พไธๅˆฐ bโˆˆAโ€‹ ไฝฟๅพ— a+bโ‰กx(modm)โ€‹ใ€‚้‚ฃไนˆ xโˆˆA+Bโ€‹๏ผˆๅฎšไน‰ A+B={a+b:aโˆˆA,bโˆˆB}โ€‹๏ผ‰ใ€‚ๅ่ฟ‡ๆฅ่ฎฒ๏ผŒๅฆ‚ๆžœ xโˆ‰A+Bโ€‹๏ผŒ้‚ฃไนˆไธ€ๅฎš่ƒฝๆŠŠ Aโ€‹ ไธญๆ‰€ๆœ‰ๅ…ƒ็ด ้…ๅฏน๏ผˆๅฏ่ƒฝไธคไธชๆ•ฐ็›ธๅŒ๏ผ‰๏ผŒไนŸๅณ xโˆ‰A+BโŸบA=xโˆ’Aโ€‹๏ผˆๅฎšไน‰ xโˆ’A={xโˆ’a:aโˆˆA}โ€‹๏ผ‰ใ€‚

็„ถๅŽๆˆ‘ไปฌๅฆ‚ๆžœๆŠŠๅฐไบŽ m ็š„ๆ•ดๆ•ฐ็œ‹ๆˆไธ€ไธช็Žฏ๏ผŒๅฆ‚ๆžœๆœ‰ไธคไธชๆ•ฐ a,b ไฝฟ a+bโ‰กx(modm)๏ผŒa ้กบๆ—ถ้’ˆๆ—ถ้’ˆ็งปๅŠจ๏ผŒb ่‚ฏๅฎš้€†ๆ—ถ้’ˆ็งปๅŠจ๏ผˆๅณ่ฟๅŠจๆ–นๅ‘็›ธๅ๏ผŒไธ”็งปๅŠจ็š„้•ฟๅบฆๅบ”่ฏฅๆ˜ฏ็›ธ็ญ‰็š„๏ผˆ(a+k)modm+(bโˆ’k)modmโ‰กa+b(modm) ๅ˜›๏ผ‰ใ€‚

ไบŽๆ˜ฏๆˆ‘ไปฌ็”ปไธคไธชๅœ†๏ผŒ้ƒฝ่กจ็คบ้›†ๅˆ {ai}๏ผˆๅ‡่ฎพ ai ๅทฒ็ปๆŽ’ๅฅฝๅบ๏ผ‰๏ผŒๆˆ‘ไปฌ่ฆๆŠŠ็ฌฌไธ€ไธชๅœ†็š„็‚นไธŽ็ฌฌไบŒไธชๅœ†็š„็‚นๅŒน้…ใ€‚

ๅ‡่ฎพ ai ไธŽ aj ๅŒน้…ใ€‚ๆˆ‘ไปฌๆŠŠ i ็งปๅŠจ่‡ณ i+1๏ผŒ้‚ฃไนˆๆ นๆฎไธŠ้ขๆŽจๅ‡บ็š„ๅ•่ฐƒๆ€ง๏ผŒj ๅฟ…้กป็งป่‡ณ jโˆ’1๏ผˆๅ› ไธบ aiโˆผai+1 ไน‹้—ดๆฒกๆœ‰ๆ•ฐไบ†๏ผŒๆ‰€ไปฅ j ไนŸๅช่ƒฝ็งปๅŠจไธ€ๆ ผ๏ผ‰๏ผŒๅˆๅ› ไธบ็งปๅŠจ่ท็ฆปๅฟ…้กป็›ธ็ญ‰๏ผŒๅณ ai+1โˆ’ai=ajโˆ’ajโˆ’1ใ€‚

ๆ‰€ไปฅๆˆ‘ไปฌไปค bi=aiโˆ’aiโˆ’1๏ผˆb1=(a1โˆ’an)modm๏ผ‰๏ผŒ่ฎพไธฒ s1=bnbnโˆ’1bnโˆ’2โ‹ฏb1,s2=b1b2b3โ‹ฏbn๏ผŒๆˆ‘ไปฌ่ฆๆ‰พ็š„ๆ˜ฏ s1 ไธŽ s2 ๆˆ็ŽฏๅŽ็›ธ็ญ‰๏ผŒๅนถๆ‰พๅˆฐไธ€ๅฏนๅŒน้…็š„ๆ•ฐ๏ผŒไป–ไปฌๅŠ ่ตทๆฅๆจก m ๅณไธบไธ€็ป„่งฃใ€‚ๆˆ‘ไปฌไปค s3=s2+s2๏ผŒๆ‰พๅˆฐ s3 ไธญๆ‰€ๆœ‰็ญ‰ไบŽ s1 ็š„ๅญไธฒ๏ผŒๅฐฑๅพ—ๅˆฐไบ†ๆ‰€ๆœ‰่งฃ๏ผŒ่ฟ™ไธช้—ฎ้ข˜็”จKMPๆˆ–ๆ˜ฏZ้ƒฝ่ƒฝ่งฃๅ†ณใ€‚

ไปฃ็ 

cpp
#include <cstdio>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int maxn = 200005;

LL aa[maxn]; // ่ฏปๅ…ฅ็š„a
LL bb[maxn]; // ๅณไธŠ้ข่ฏด็š„b
vector<LL> gou;
int in[maxn << 2];
LL Z[maxn << 2];
set<LL> ans;

int main()
{
    int n;
    LL m;
    scanf("%d%lld", &n, &m);
    for(int i = 1; i <= n; ++i)
        scanf("%lld", &aa[i]);
    bb[1] = ((aa[1] - aa[n]) + m) % m;
    for(int i = 2; i <= n; ++i)
        bb[i] = ((aa[i] - aa[i-1]) % m + m) % m;
    for(int i = n; i; --i) // ่ฟ™้‡Œ็”จ็š„ๆ˜ฏZ็ฎ—ๆณ•๏ผŒๆ‰€ไปฅๅˆๅนถๆˆไบ†ไธ€ไธชไธฒ
    {
        gou.push_back(bb[i]);
        in[gou.size() - 1] = i;
    }
    gou.push_back(-1LL);
    for(int i = 1; i <= n; ++i)
    {
        gou.push_back(bb[i]);
        in[gou.size() - 1] = i;
    }
    for(int i = 1; i <= n; ++i)
    {
        gou.push_back(bb[i]);
        in[gou.size() - 1] = i;
    }
    Z[0] = gou.size();
    for(int i = 1, j = 1, k; i < (int) gou.size(); i = k) // Z็ฎ—ๆณ•
    {
        j = max(j, i);
        while(gou[j] == gou[j - i])
            ++j;
        Z[i] = j - i;
        k = i + 1;
        while(k + Z[k - i] < j)
        {
            Z[k] = Z[k - i];
            ++k;
        }
    }
    for(int i = 1; i < (int) gou.size(); ++i)
        if(Z[i] >= n) // ๅคงๅŠ›่ฎฐๅฝ•็ญ”ๆกˆ
            ans.insert((aa[in[i] - 1 ? in[i] - 1 : n] + aa[n]) % m);
    printf("%d\n", (int) ans.size());
    for(auto it = ans.begin(); it != ans.end(); ++it)
        printf("%lld ", *it);
    return 0;
}

Cite this post

@misc{pu2018oiicpccodeforcescf1045b,
  author = {Pu, Fanyi},
  title  = {CodeForces 1045B Space Isaac},
  year   = {2018},
  month  = {9},
  url    = {https://pufanyi.com/blog/oi-icpc/codeforces/cf1045b}
}