ๅ้ข้พๆฅ
0โผ๐โ1 ็ๆฐ่ขซๅๆไธคไธช้ๅ๏ผไฝ ๅฏไปฅๅๅซไปไธคไธช้ๅไธญๅไธไธชๆฐ็ธๅ ๅนถๅฏน ๐ ๅๆจก๏ผๆฑ 0โผ๐โ1 ไธญไธ่ฝๆ้ ๅบ็ๆฐใ
้ข่งฃ
ๆ่งๅฆๆsxd666ๆฅๅ่ฟ้ข่ฏๅฎ่ฝไธ็ผ็ง๏ผ็ถ่ไปๆญฃๅฟ็ๅๅ
ถไป้ขใ
้ฆๅ
ๆไปฌๅ็ฐๅฆๆ่ฆ่ฎฉ ๐+๐โก๐ฅ(mod๐)โ๏ผๅฆๆๅทฒ็ฅ ๐,๐ฅโ๏ผ้ฃ ๐โ ไธๅฎๆฏๅฏไธ็ใไนๅฐฑๆฏ่ฏด๏ผๅ่ฎพ็ปๅฎ้ๅๆฏ ๐ดโ๏ผไธไนๅฏนๅบ็้ๅไธบ ๐ตโ๏ผๅฆๆๆ ๐โ๐ดโ ไฝๆพไธๅฐ ๐โ๐ดโ ไฝฟๅพ ๐+๐โก๐ฅ(mod๐)โใ้ฃไน ๐ฅโ๐ด+๐ตโ๏ผๅฎไน ๐ด+๐ต={๐+๐:๐โ๐ด,๐โ๐ต}โ๏ผใๅ่ฟๆฅ่ฎฒ๏ผๅฆๆ ๐ฅโ๐ด+๐ตโ๏ผ้ฃไนไธๅฎ่ฝๆ ๐ดโ ไธญๆๆๅ
็ด ้
ๅฏน๏ผๅฏ่ฝไธคไธชๆฐ็ธๅ๏ผ๏ผไนๅณ ๐ฅโ๐ด+๐ตโบ๐ด=๐ฅโ๐ดโ๏ผๅฎไน ๐ฅโ๐ด={๐ฅโ๐:๐โ๐ด}โ๏ผใ
็ถๅๆไปฌๅฆๆๆๅฐไบ ๐ ็ๆดๆฐ็ๆไธไธช็ฏ๏ผๅฆๆๆไธคไธชๆฐ ๐,๐ ไฝฟ ๐+๐โก๐ฅ(mod๐)๏ผ๐ ้กบๆถ้ๆถ้็งปๅจ๏ผ๐ ่ฏๅฎ้ๆถ้็งปๅจ๏ผๅณ่ฟๅจๆนๅ็ธๅ๏ผไธ็งปๅจ็้ฟๅบฆๅบ่ฏฅๆฏ็ธ็ญ็๏ผ(๐+๐)mod๐+(๐โ๐)mod๐โก๐+๐(mod๐) ๅ๏ผใ
ไบๆฏๆไปฌ็ปไธคไธชๅ๏ผ้ฝ่กจ็คบ้ๅ {๐๐}๏ผๅ่ฎพ ๐๐ ๅทฒ็ปๆๅฅฝๅบ๏ผ๏ผๆไปฌ่ฆๆ็ฌฌไธไธชๅ็็นไธ็ฌฌไบไธชๅ็็นๅน้
ใ
ๅ่ฎพ ๐๐ ไธ ๐๐ ๅน้
ใๆไปฌๆ ๐ ็งปๅจ่ณ ๐+1๏ผ้ฃไนๆ นๆฎไธ้ขๆจๅบ็ๅ่ฐๆง๏ผ๐ ๅฟ
้กป็งป่ณ ๐โ1๏ผๅ ไธบ ๐๐โผ๐๐+1 ไน้ดๆฒกๆๆฐไบ๏ผๆไปฅ ๐ ไนๅช่ฝ็งปๅจไธๆ ผ๏ผ๏ผๅๅ ไธบ็งปๅจ่ท็ฆปๅฟ
้กป็ธ็ญ๏ผๅณ ๐๐+1โ๐๐=๐๐โ๐๐โ1ใ
ๆไปฅๆไปฌไปค ๐๐=๐๐โ๐๐โ1๏ผ๐1=(๐1โ๐๐)mod๐๏ผ๏ผ่ฎพไธฒ ๐ 1=๐๐๐๐โ1๐๐โ2โฏ๐1,๐ 2=๐1๐2๐3โฏ๐๐๏ผๆไปฌ่ฆๆพ็ๆฏ ๐ 1 ไธ ๐ 2 ๆ็ฏๅ็ธ็ญ๏ผๅนถๆพๅฐไธๅฏนๅน้
็ๆฐ๏ผไปไปฌๅ ่ตทๆฅๆจก ๐ ๅณไธบไธ็ป่งฃใๆไปฌไปค ๐ 3=๐ 2+๐ 2๏ผๆพๅฐ ๐ 3 ไธญๆๆ็ญไบ ๐ 1 ็ๅญไธฒ๏ผๅฐฑๅพๅฐไบๆๆ่งฃ๏ผ่ฟไธช้ฎ้ข็จKMPๆๆฏZ้ฝ่ฝ่งฃๅณใ
ไปฃ็
#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;
}