社区讨论
关于 lambda 神人语法
学术版参与者 9已保存回复 22
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 22 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2xuhq
- 此快照首次捕获于
- 2025/11/03 19:51 4 个月前
- 此快照最后确认于
- 2025/11/03 20:41 4 个月前
本人在写 lambda 的时候,用了引用捕获
CPPnamespace pollard {
auto qpow = [] (int bs ,int p ,int mod) -> int {
int ans = 1ll ;
for (; p ; p >>= 1 ,bs = ((ll) bs) * ((ll) bs) % mod)
((p & 1) && (ans = ((ll) ans) * ((ll) bs) % mod)) ;
return ans ;
} ;
auto mlrb = [&qpow] (int x) -> bool {
if (x < 3 || x % 2 == 0) return x == 2 ;
int t = __builtin_ctzll (x - 1) ,r = (x - 1) >> t ;
f (i ,1 ,12 ,1) {
if (pr[i] == x) return true ;
int v = qpow (pr[i] ,r ,x) ;
f (j ,1 ,t ,1) {
int b = ((ll) v) * ((ll) v) % x ;
if (b == 1 && (v != 1 && v != x - 1)) return false ;
v = b ;
if (v == 1 || (v == x - 1 && (j ^ t))) { v = 1 ; break ;}
} if (v != 1) return false ;
} return true ;
} ;
auto gcd = [] (int a ,int b) -> int {
int atz = __builtin_ctzll (a) ,btz = __builtin_ctzll (b) ;
int z = std :: min (atz ,btz) ;
b >>= btz ;
while (a) {
a >>= atz ;
int minu = std :: abs (a - b) ;
((minu < 0) && (minu = -minu)) ;
b = std :: min (a ,b) ;
atz = __builtin_ctzll (a = minu) ;
} return b << z ;
} ;
auto g = [] (int x ,int c ,int mod) -> int {
ll v = ((ll) x) * ((ll) x) + ((ll) c) ;
return v % mod ;
} ;
auto rho = [&g ,&gcd] (int n) -> int {
if (n == 4) return 2 ;
static std :: mt19937 rng
(std :: chrono :: system_clock :: now ().time_since_epoch ().count ()) ;
std :: uniform_int_distribution < int > rnd (3 ,n - 1) ;
int x = rnd (rng) ,y = x ,c = rnd (rng) ;
y = g (g (x ,c ,n) ,c ,n) ,x = g (x ,c ,n) ;
for (int lim = 1 ; x ^ y ; lim = std :: min (lim << 1 ,128ll)) {
int mul = 1ll ;
f (i ,1 ,lim ,1) {
int tmp = ((ll) mul) * ((ll) std :: abs (x - y)) % n ;
if (! tmp) break ;
mul = tmp ;
x = g (x ,c ,n) ,y = g (g (y ,c ,n) ,c ,n) ;
}
int d = gcd (mul ,n) ;
if (d != 1) return d ;
} return n ;
} ;
inline void dfs (int n) {
if (n == 1) return ;
if (mlrb (n))
return ans = std :: max (ans ,n) ,void () ;
int p = n ;
for (; p == n ; p = rho (n)) ;
dfs (p) ,dfs (n / p) ;
}
}
这个是过编的,可以发现其中我的 mlrb,rho 表达式都显式捕获了其他表达式。
但是当我把捕获的具体名称删去,比如改为
auto mlrb = [&] () -> int,在 c++14 GCC9 洛谷上就会 CE,本地能过,编译命令 --std=c++14 -O2 -Wall -Wextra。这是为啥,求大手子指教。
回复
共 22 条回复,欢迎继续交流。
正在加载回复...