Visit of the Great
1.前言
真好玩,蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤
2.题解
令 G ( x ) = { 1 , 2 ∣ x 2 , 2 ∤ x g c d ( k 2 i + 1 , k 2 i + 1 + 1 ) = g c d ( k 2 i + 1 , k 2 i + 1 − k 2 i ) = g c d ( k 2 i + 1 , k 2 i × ( k 2 i − 1 ) ) = g c d ( k 2 i + 1 , k 2 i − 1 ) = g c d ( ( k 2 i + 1 ) − ( k 2 i − 1 ) , k 2 i − 1 ) = g c d ( 2 , k 2 i − 1 ) = G ( k ) \begin{aligned}令 G (x) = \begin{cases} 1, 2 \mid x \\ 2, 2 \nmid x \end{cases}\\gcd (k^{2^{i}} + 1, k^{2^{i + 1}} + 1) &= gcd (k^{2^{i}} + 1, k^{2^{i + 1}} - k^{2^{i}})\\&= gcd (k^{2^{i}} + 1, k^{2^{i}} \times (k^{2^{i}} - 1))\\&= gcd (k^{2^{i}} + 1, k^{2^{i}} - 1)\\&= gcd ((k^{2^{i}} + 1) - (k^{2^{i}} - 1), k^{2^{i}} - 1)\\&= gcd (2, k^{2^{i}} - 1)\\&= G (k)\end{aligned} 令G(x)={1,2∣x2,2∤xgcd(k2i+1,k2i+1+1)=gcd(k2i+1,k2i+1−k2i)=gcd(k2i+1,k2i×(k2i−1))=gcd(k2i+1,k2i−1)=gcd((k2i+1)−(k2i−1),k2i−1)=gcd(2,k2i−1)=G(k)
l c m i = l r ( k 2 i + 1 ) m o d p = l c m ( l c m i = l r − 2 ( k 2 i + 1 ) , ( k 2 r − 1 + 1 ) × ( k 2 r + 1 ) g c d ( k 2 r − 1 + 1 , k 2 r + 1 ) ) = l c m ( l c m i = l r − 2 ( k 2 i + 1 ) , ( k 2 r − 1 + 1 ) × ( k 2 r + 1 ) G ( k ) ) = l c m ( l c m i = l r − 3 ( k 2 i + 1 ) , ( k 2 r − 2 + 1 ) × ( k 2 r − 1 + 1 ) × ( k 2 r + 1 ) G ( k ) × G ( k ) ) = . . . \begin{aligned}\mathrm{lcm}_{i = l}^{r} (k^{2^{i}} + 1) \bmod p &= lcm (lcm_{i = l}^{{r - 2}} (k^{2^{i}} + 1), \frac{(k^{2^{r - 1}} + 1) \times (k^{2^{r}} + 1)}{gcd (k^{2^{r - 1}} + 1, k^{2^{r}} + 1)} )\\&= lcm (lcm_{i = l}^{{r - 2}} (k^{2^{i}} + 1), \frac{(k^{2^{r - 1}} + 1) \times (k^{2^{r}} + 1)}{G (k)} )\\&= lcm (lcm_{i = l}^{{r - 3}} (k^{2^{i}} + 1), \frac{(k^{2^{r - 2}} + 1) \times (k^{2^{r - 1}} + 1) \times (k^{2^{r}} + 1)}{G (k) \times G (k)} ) \\ &=... \end{aligned} lcmi=lr(k2i+1)modp=lcm(lcmi=lr−2(k2i+1),gcd(k2r−1+1,k2r+1)(k2r−1+1)×(k2r+1))=lcm(lcmi=lr−2(k2i+1),G(k)(k2r−1+1)×(k2r+1))=lcm(lcmi=lr−3(k2i+1),G(k)×G(k)(k2r−2+1)×(k2r−1+1)×(k2r+1))=...
l c m i = l r ( k 2 i + 1 ) m o d p = ∏ i = l r ( k 2 i + 1 ) G ( K ) r − l m o d p = ∏ i = l r ( k 2 i + 1 ) G r − l ( K ) m o d p \begin{aligned}\mathrm{lcm}_{i = l}^{r} (k^{2^{i}} + 1) \bmod p &= \frac{\prod_{i = l}^{r} (k^{2^{i}} + 1)}{G(K)^{r - l}} \bmod p\\&= \frac{\prod_{i = l}^{r} (k^{2^{i}} + 1)}{G^{r - l}(K)} \bmod p\end{aligned} lcmi=lr(k2i+1)modp=G(K)r−l∏i=lr(k2i+1)modp=Gr−l(K)∏i=lr(k2i+1)modp
发现这个小东西
∏
i
=
l
r
(
(
k
2
l
)
i
−
l
+
1
)
\prod_{i = l}^{r} ((k^{2^{l}})^{i - l} + 1)
∏i=lr((k2l)i−l+1) 就是
∑
i
=
0
r
=
2
r
−
l
+
1
−
1
(
k
2
l
)
i
\sum\limits_{i = 0}^{r = 2^{r - l + 1} - 1} (k^{2^{l}})^i
i=0∑r=2r−l+1−1(k2l)i (二进制拆分的唯一性)
(
k
2
l
)
2
r
−
l
+
1
−
1
k
2
l
−
1
=
k
2
r
+
1
−
1
k
2
l
−
1
\begin{aligned} \frac{(k^{2^{l}})^{2^{r - l + 1}} - 1}{k^{2^{l}} - 1}\\= \frac{k^{2^{r + 1}} - 1}{k^{2^{l}} - 1}\end{aligned}
k2l−1(k2l)2r−l+1−1=k2l−1k2r+1−1
l c m i = l r ( k 2 i + 1 ) m o d p = k 2 r + 1 − 1 ( k 2 l − 1 ) × G r − l ( K ) \begin{aligned}\mathrm{lcm}_{i = l}^{r} (k^{2^{i}} + 1) \bmod p &= \frac{k^{2^{r + 1}} - 1}{(k^{2^{l}} - 1) \times G^{r - l}(K)}\end{aligned} lcmi=lr(k2i+1)modp=(k2l−1)×Gr−l(K)k2r+1−1
然后有一个很 ?? 的 ?? 特判, k m o d p = = 0 k \bmod p == 0 kmodp==0 时要搞很多奇怪的东西,去 ? 好了。
因为当 k m o d p = = 0 k \bmod p == 0 kmodp==0 时, 2 r + 1 m o d ( p − 1 ) 2^{r + 1} \bmod (p - 1) 2r+1mod(p−1) 如果为零,则它会算出来一个 k 0 m o d p = 1 k ^ 0 \bmod p = 1 k0modp=1,所以不对,这时候改为返回值为 0 0 0 就好了。
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define db double
#define LL long long
#define ULL unsigned long long
#define PII pair <int, int>
#define MP(x,y) make_pair (x, y)
#define rep(i,j,k) for (int i = (j); i <= (k); ++i)
#define per(i,j,k) for (int i = (j); i >= (k); --i)
template <typename T> T Max (T x, T y) { return x > y ? x : y; }
template <typename T> T Min (T x, T y) { return x < y ? x : y; }
template <typename T> T Abs (T x) { return x > 0 ? x : -x; }
template <typename T>
void read (T &x) {
x = 0; T f = 1;
char ch = getchar ();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar ();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + ch - '0';
ch = getchar ();
}
x *= f;
}
template <typename T, typename... Args>
void read (T &x, Args&... args) {
read (x); read (args...);
}
char For_Print[25];
template <typename T>
void write (T x) {
if (x == 0) { putchar ('0'); return; }
if (x < 0) { putchar ('-'); x = -x; }
int poi = 0;
while (x) {
For_Print[++poi] = x % 10 + '0';
x /= 10;
}
while (poi) putchar (For_Print[poi--]);
}
template <typename T>
void print (T x, char ch) {
write (x); putchar (ch);
}
const LL Mod = 1e9 + 7;
LL sqre (LL x) { return x * x % Mod; }
void del (LL &x, LL y) { ((x -= y) < 0) && (x += Mod); }
void add (LL &x, LL y) { ((x += y) >= Mod) && (x -= Mod); }
LL t, k, l, r, p;
LL quick_pow (LL x, LL y, LL M) {
LL res = 1;
while (y) {
if (y & 1) res = (res * x) % M;
x = (x * x) % M; y >>= 1;
}
return res;
}
LL inv (LL x, LL M) {
return quick_pow (x, M - 2, M);
}
LL G (LL x) {
return (x % 2 == 0 ? 1 : 2);
}
LL f (LL x) {
return k % p == 0 ? 0 : quick_pow (k, quick_pow (2, x, p - 1), p);
}
int main () {
// freopen ("D:\\lihan\\1.in", "r", stdin);
// freopen ("D:\\lihan\\1.out", "w", stdout);
read (t);
while (t--) {
read (k, l, r, p);
if (p == 2) {
printf ("%d\n", (k % 2 == 1 ? 0 : 1));
continue;
}
LL res = 0;
if (f (l) == 1) {
res = quick_pow (2, r - l + 1, p);
}
else {
// printf ("f (r + 1) = %lld, f (l) = %lld\n", f (r + 1), f (l));
res = f (r + 1) - 1 + p;
res = (res * inv (f (l) - 1 + p, p)) % p;
}
// cout << res << endl;
res *= inv (quick_pow (G (k), r - l, p) % p, p);
res = (res % p + p) % p;
print (res, '\n');
}
return 0;
}
3.一些编辑很久的错误式子,pi用没有😓,下次我就要用这个出题 /wx
g c d i = l r ( k 2 i + 1 ) m o d p = g c d ( ( k 2 l + 1 ) , g c d i = l + 1 r ( ( k 2 i + 1 ) − ( k 2 i − 1 + 1 ) ) ) m o d p = g c d ( ( k 2 l + 1 ) , g c d i = l + 1 r ( k 2 i − k 2 i − 1 ) ) m o d p = g c d ( ( k 2 l + 1 ) , g c d i = l + 1 r ( k 2 i − 1 ⋅ 2 − k 2 i − 1 ) ) m o d p = g c d ( ( k 2 l + 1 ) , g c d i = l + 1 r ( k 2 i − 1 × k 2 i − 1 − k 2 i − 1 ) ) m o d p = g c d ( ( k 2 l + 1 ) , g c d i = l + 1 r ( k 2 i − 1 × ( k 2 i − 1 − 1 ) ) ) m o d p = g c d ( ( k 2 l + 1 ) , k 2 l ⋅ g c d i = l + 1 r ( k 2 i − 1 − 1 ) ) m o d p = g c d ( ( k 2 l + 1 ) , g c d i = l r − 1 ( k 2 i − 1 ) ) m o d p \begin{aligned}\mathrm{gcd}_{i = l}^{r} (k^{2^{i}} + 1) \bmod p &= gcd \bigg( (k^{2^{l}} + 1), \mathrm{gcd}_{i = l + 1}^{r} \Big( (k^{2^{i}} + 1) - (k^{2^{i - 1}} + 1) \Big) \bigg) \bmod p\\&= gcd \bigg( (k^{2^{l}} + 1), \mathrm{gcd}_{i = l + 1}^{r} \Big( k^{2^{i}} - k^{2^{i - 1}} \Big) \bigg) \bmod p\\&= gcd \bigg( (k^{2^{l}} + 1), \mathrm{gcd}_{i = l + 1}^{r} \Big( k^{2^{i - 1} \cdot 2} - k^{2^{i - 1}} \Big) \bigg) \bmod p\\&= gcd \bigg( (k^{2^{l}} + 1), \mathrm{gcd}_{i = l + 1}^{r} \Big( k^{2^{i - 1}} \times k^{2^{i - 1}} - k^{2^{i - 1}} \Big) \bigg) \bmod p \\&= gcd \bigg( (k^{2^{l}} + 1), \mathrm{gcd}_{i = l + 1}^{r} \Big( k^{2^{i - 1}} \times (k^{2^{i - 1}} - 1) \Big) \bigg) \bmod p\\&= gcd \bigg( (k^{2^{l}} + 1), k^{2^{l}} \cdot \mathrm{gcd}_{i = l + 1}^{r} \Big( k^{2^{i - 1}} - 1 \Big) \bigg) \bmod p\\&= gcd \bigg( (k^{2^{l}} + 1), \mathrm{gcd}_{i = l}^{r - 1} \Big( k^{2^{i}} - 1 \Big) \bigg) \bmod p\end{aligned} gcdi=lr(k2i+1)modp=gcd((k2l+1),gcdi=l+1r((k2i+1)−(k2i−1+1)))modp=gcd((k2l+1),gcdi=l+1r(k2i−k2i−1))modp=gcd((k2l+1),gcdi=l+1r(k2i−1⋅2−k2i−1))modp=gcd((k2l+1),gcdi=l+1r(k2i−1×k2i−1−k2i−1))modp=gcd((k2l+1),gcdi=l+1r(k2i−1×(k2i−1−1)))modp=gcd((k2l+1),k2l⋅gcdi=l+1r(k2i−1−1))modp=gcd((k2l+1),gcdi=lr−1(k2i−1))modp
g c d i = l r ( k 2 i − 1 ) = g c d ( k 2 l − 1 , g c d i = l + 1 r ( k 2 i − k 2 i − 1 ) ) m o d p = g c d ( k 2 l − 1 , k 2 l ⋅ g c d i = l r − 1 ( k 2 i − 1 ) ) m o d p = ( k 2 l − 1 ) m o d p \begin{aligned}\mathrm{gcd}_{i = l}^{r} \Big( k^{2^{i}} - 1 \Big)&= gcd \Big( k^{2^{l}} - 1, \mathrm{gcd}_{i = l + 1}^{r} (k^{2^{i}} - k^{2^{i - 1}}) \Big) \bmod p\\&= gcd \Big( k^{2^{l}} - 1, k^{2^{l}} \cdot \mathrm{gcd}_{i = l}^{r - 1} (k^{2^{i}} - 1) \Big) \bmod p\\&= (k^{2^{l}} - 1) \bmod p\end{aligned} gcdi=lr(k2i−1)=gcd(k2l−1,gcdi=l+1r(k2i−k2i−1))modp=gcd(k2l−1,k2l⋅gcdi=lr−1(k2i−1))modp=(k2l−1)modp
所以原式可以化为
g c d i = l r ( k 2 i + 1 ) m o d p = g c d ( ( k 2 l + 1 ) , ( k 2 l − 1 ) ) m o d p \begin{aligned}\mathrm{gcd}_{i = l}^{r} (k^{2^{i}} + 1) \bmod p &= gcd ((k^{2^{l}} + 1), (k^{2^{l}} - 1)) \bmod p\end{aligned} gcdi=lr(k2i+1)modp=gcd((k2l+1),(k2l−1))modp