ๆ ๐(2โค๐โค4โ
106) ไธช่็น๏ผ็ผๅท 1โผ๐๏ผไฝ ไธๅผๅงๅจ่็น ๐๏ผๆณ่ฆๅฐ่็น 1ใๅ่ฎพไฝ ็ฐๅจๅจ่็น ๐ฅ๏ผไฝ ๅฏไปฅ่ฟ่กไปฅไธไธค็งๆไฝ๏ผ
- ้ๆฉไธไธชๆญฃๆดๆฐ ๐ฆโ[1,๐ฅโ1]๏ผๅนถ็งปๅจๅฐ่็น ๐ฅโ๐ฆใ
- ้ๆฉไธไธชๆญฃๆดๆฐ ๐งโ[2,๐ฅ]๏ผๅนถ็งปๅจๅฐ่็น โ๐ฅ๐งโใ
ๆฑๆๅคๅฐ็งๆนๆกๅฐ่พพ่็น 1๏ผๅช่ฆๆไธๆฌก้ๆฉ็ ๐ฅ ๆ ๐ง ไธๅๅฐฑ็ฎๆนๆกไธๅใ็ญๆกๅฏน ๐ ๅๆจก๏ผๅ
ถไธญ ๐โ(108,109) ไธ ๐ ๆฏ็ด ๆฐใ
ไปค ๐๐ ่กจ็คบ ๐=๐ ๆถ็็ญๆก๏ผๆไปฌๆ๏ผ
๐๐=๐โ1โ๐=1๐๐+๐โ๐=2๐โ๐๐โ
ๅไธ้จๅ่กจ็คบ็จๅๆณ๏ผๅไธ้จๅ่กจ็คบ็จ้คๆณใ
่่ไผๅ๏ผ็ฌฌไธ้จๅ็ดๆฅๅ็ผๅ๏ผๆไปฌ็ดๆฅ่่็ฌฌไบ้จๅใไธ็งๅพ็ดๆฅ็ไผๅๆฏๅฐๅฐไบ โ๐ ็ ๐ ็ดๆฅๆฟๅบๆฅ็ฎ๏ผๅคงไบ โ๐ ็ ๐ ๆฟๅบๆฅ็ฎ่ดก็ฎ๏ผ ๐๐ ่ฝ่ฝฌ็งปๅฐ ๐๐ ็ ๐ ๅบ่ฏฅๆปก่ถณ ๐โค๐๐<๐+1๏ผไนๅณ ๐๐+1<๐โค๐๐๏ผไบๆฏ ๐๐ ๅฏน ๐๐ ็่ดก็ฎๅบ่ฏฅไธบ โ๐๐โโโ๐๐+1โใ่ฟๆ ทๅๅคๆๅบฆๆฏ O(๐โ๐)๏ผ่ฟไธๅป๏ผไฝๆฏๅฆๆไฝ ๆ Div. 2 ็่ฏๅฐฑ่ฝ่ฟไธไธช easy ็ใ
ๆไปฌ่่ๆขไธ็งๆนๅผ๏ผ่่ ๐๐ ่ฝฌ็งปๅฐ ๐๐+1๏ผๆไปฌๆฏ่พ โ๐๐=2๐โ๐๐โ ไธ โ๐+1๐=2๐โ๐+1๐โ๏ผๆๅฆไธๅๅ๏ผ
- ๅคไบไธไธช ๐1๏ผๅ ไธบ ๐ ๅฏไปฅ็ญไบ ๐+1ใ
- ๅฏนไบๆๆ ๐โฃ๐+1๏ผโ๐+1๐โ=โ๐๐โ+1๏ผๆไปฅ ๐๐+1 ๆฏ ๐๐ ๅคไบไธไธช ๐โ๐+1๐โ๏ผๅฐไบไธไธช ๐โ๐๐โใ
ไนๅฐฑๆฏ่ฏด๏ผ
๐๐+1=๐โ๐=1๐๐+๐+1โ๐=2๐โ๐+1๐โ=๐๐+๐โ1โ๐=1๐๐+๐+1โ๐=2๐โ๐+1๐โ=๐๐+๐๐+๐1+โ๐โฃ๐+1(๐โ๐+1๐โโ๐โ๐๐โ)=2๐๐+๐1+โ๐โฃ๐+1(๐โ๐+1๐โโ๐โ๐๐โ)
ๆไปฌๅ็ฐๅฏนไบๆๆ ๐๏ผๆป็็บฆๆฐไธชๆฐไธบ โ๐๐=1๐๐=O(๐logโก๐)ใๅ
ถไฝ่ฝฌ็งปไธบ O(๐)๏ผๆ
ๆปๅคๆๅบฆไธบ O(๐logโก๐)ใ
่่ๅฎ็ฐ๏ผๅจๆฏๆฌก่ฎก็ฎๅบ ๐๐ ็ๆถๅ๏ผๅฐๆๆ็ ๐๐๐ ้ฝๅ ไธ ๐๐โ๐๐โ1๏ผ่ฟๆ ท็ฉบ้ดๅคๆๅบฆๅฐฑๆฏ O(๐)ใ
const int maxn = 4000005;
int n, mod;
void add(int& x, int y) {
x += y;
if (x >= mod) {
x -= mod;
} else if (x < 0) {
x += mod;
}
}
int f[maxn];
int main() {
read(n), read(mod);
f[1] = 1;
for (int i = 2; i <= n; ++i) {
int tmp = f[i - 1] << 1 | 1;
if (tmp >= mod) {
tmp -= mod;
}
add(f[i], tmp);
if (i == 2) {
f[i] = 2;
}
for (int j = i << 1; j <= n; j += i) {
add(f[j], f[i]);
add(f[j], -f[i - 1]);
}
}
writeln(f[n]);
return 0;
}