a & (n - 1) 等价于 a % n,是取模的典型做法。

a & (n - 1) 等价于 a % n,是取模的典型做法。

trace("-1%4",-1%4);

trace("0%4",0%4);

trace("3%4",3%4);

trace("5%4",5%4);

trace("9%4",9%4);

trace("15%4",15%4);

trace("64&4",64%4);

 

trace("-1&4",-1&(4-1));

trace("0&4",0&(4-1));

trace("3&4",3&(4-1));

trace("5&4",5&(4-1));

trace("9&4",9&(4-1));

trace("15&4",15&(4-1));

trace("64&4",64&(4-1));

//a & (n - 1) 等价于 a % n,是取模的典型做法。

posted on 2010-01-13 14:05 jiahuafu 阅读(...) 评论(...) 编辑 收藏

请把用下內容转成markdown语法,注意公式 数学部分详细讲解 问题重述 我们需要计算长度为 n n 的数组 a a 的数量,其中每个元素 a i a i ​ 在 [ 1 , n ] [1,n] 之间,并且数组 a a 满足以下两个条件之一: 单调不减:对于所有 1 ≤ i < n 1≤i<n,有 a i ≤ a i + 1 a i ​ ≤a i+1 ​ 。 单调不增:对于所有 1 ≤ i < n 1≤i<n,有 a i ≥ a i + 1 a i ​ ≥a i+1 ​ 。 最终结果需要对 998244353 。 关键观察 单调不减数组的数量:这相当于将 n n 个不可区分的“增量”分配到 n n 个可能的“值”中,允许某些值为空(即不增加)。这是一个典型“星和条”问题。 单调不增数组的数量:同理,这也是一个“星和条”问题,只是方向相反。 重复计数:所有元素相等的数组既满足单调不减,又满足单调不增,因此需要减去这些重复计数的数组。 组合数学推导 单调不减数组的数量: 设数组的第一个元素为 a 1 a 1 ​ ,后续元素可以保持不变或增加。 我们需要选择 n n 个数 a 1 ≤ a 2 ≤ ⋯ ≤ a n a 1≤a 2≤⋯≤a n ​ ,其中 1 ≤ a i ≤ n 1≤a i ​ ≤n。 这等价于将 n n 个不可区分的“增量”分配到 n n 个可能的“值”中,允许某些值为空。 使用“星和条”定理,数量为 ( n + n − 1 n ) ( 2 n − 1 n ) ( n n+n−1)=( n 2n−1)。 单调不增数组的数量: 类似地,设数组的第一个元素为 a 1 a 1 ​ ,后续元素可以保持不变或减少。 我们需要选择 n n 个数 a 1 ≥ a 2 ≥ ⋯ ≥ a n a 1≥a 2≥⋯≥a n ​ ,其中 1 ≤ a i ≤ n 1≤a i ​ ≤n。 这也是“星和条”问题,数量同样为 ( 2 n − 1 n ) ( n 2n−1)。 重复计数的数组: 所有元素相等的数组既满足单调不减,又满足单调不增。 这样的数组共有 n n 个(即所有元素为 1, 2, …, n)。 总数计算: 单调不减数组的数量: ( 2 n − 1 n ) ( n 2n−1)。 单调不增数组的数量: ( 2 n − 1 n ) ( n 2n−1)。 重复计数的数组数量: n n。 因此,总数为 ( 2 n − 1 n ) + ( 2 n − 1 n ) − n 2 × ( 2 n − 1 n ) − n ( n 2n−1)+( n 2n−1)−n=2×( n 2n−1)−n。 组合数的计算 为了高效计算组合数 ( 2 n − 1 n ) ( n 2n−1),我们使用以下方法: 预处理阶乘和逆阶乘: 计算 fact [ i ] i ! m o d     998244353 fact[i]=i!mod998244353 对于 i i 从 0 到 2 n − 1 2n−1。 计算 inv_fact [ i ] ( i ! ) − 1 m o d     998244353 inv_fact[i]=(i!) −1 mod998244353 使用费马小定理,因为 998244353 是质数。 组合数公式: ( a b ) a ! b ! ( a − b ) ! m o d     998244353 ( b a ​ )= b!(a−b)! a! ​ mod998244353。 使用预计算的阶乘和逆阶乘,可以快速得到组合数。 边界情况 当 n 1 n=1 时,唯一的数组是 [1],因此答案为 1。 当 n 2 n=2 时,单调不减数组有 [1,1], [1,2], [2,2];单调不增数组有 [1,1], [2,1], [2,2]。重复计数的是 [1,1] 和 [2,2],因此总数为 3 + 3 − 2 4 3+3−2=4。 最终公式 ans ( 2 × ( 2 n − 1 n ) − n ) m o d     998244353 ans=(2×( n 2n−1)−n)mod998244353
08-15
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int N = 1010; 7 8 int n, m, mod; 9 long long ans, y[N], f[N], g[N], p[N], s[N]; 10 11 long long qmi(long long a, int b, int p) { 12 long long res = 1; 13 while (b) { 14 if (b & 1) 15 res = res * a % p; 16 a = a * a % p; 17 b >>= 1; 18 } 19 return res; 20 } 21 22 long long solve(int n, int k) { 23 memset(y, 0, sizeof(y)); 24 memset(f, 0, sizeof(f)); 25 memset(g, 0, sizeof(g)); 26 memset(p, 0, sizeof(p)); 27 memset(s, 0, sizeof(s)); LUOGU SCP-S 2025 第一轮 C++语言试题 第 6 页,共 17 页 28 long long ans = 0; 29 for (int i = 1; i <= k + 2; i++) 30 y[i] = (y[i - 1] + qmi(i, k, mod)) % mod; 31 f[0] = g[0] = 1; 32 for (int i = 1; i <= k + 2; i++) 33 f[i] = f[i - 1] * i % mod; 34 for (int i = 1; i <= k + 2; i++) 35 g[i] = -g[i - 1] * i % mod; 36 p[0] = s[k + 3] = 1; 37 for (int i = 1; i <= k + 2; i++) 38 p[i] = p[i - 1] * (n - i) % mod; 39 for (int i = k + 2; i >= 1; i--) 40 s[i] = s[i + 1] * (n - i) % mod; 41 for (int i = 1; i <= k + 2; i++) { 42 long long t1 = p[i - 1] * s[i + 1] % mod; 43 long long t2 = f[i - 1] * g[abs(k - i + 2)] % mod; 44 (ans += y[i] * t1 % mod * qmi(t2, mod - 2, mod) % mod) %= mod; 45 ans = (ans + mod) % mod; 46 } 47 return ans; 48 } 49 50 int main() { 51 scanf("%d%d%d", &n, &m, &mod); 52 long long res = 0; 53 for (int i = 1; i <= n; i++) { 54 res += (n - i + 1) * qmi(m, n - i, mod) % mod * solve(m, i); 55 res %= mod; 56 } 57 printf("%lld", res); 58 return 0; 59 } 假设输入的 𝒏, 𝒎 是不超过 𝟏𝟎𝟎𝟎 的正整数,mod 是大于 𝟏𝟎 𝟒,但是不超过 𝟏𝟎 𝟗 + 𝟕 的质 数,完成下面的判断题和单选题。 ·判断题 21. qmi 函数实现了快速幂算法。该函数对于任意的不超过 109 + 7 的非负整数 b 和不超 LUOGU SCP-S 2025 第一轮 C++语言试题 第 7 页,共 17 页 过 109 + 7 的正整数 a,p 均能正确返回 𝑎 𝑏 对 𝑝 的值。( ) 22. 删除程序的第 23 到 27 行,程序仍然能正常运行,且输出结果不变。( ) 23. 当输入的 𝑚 为 1 时,输出总为 𝑛(𝑛 2 +1)。( ) ·单选题 24. 这份程序的最坏时间复杂度是( )。 A. Θ(𝑛 2 ) B. Θ(𝑛 log 𝑛) C. Θ(𝑛 2 log 𝑛) D. Θ(𝑛 2 log(𝑛 × mod)) 25. 对于以下的输入数据,输出结果为( )。 3 4 10331 A. 1900 B. 9500 C. 820 D. 1650 26. (4 分)这份程序求得了( )的答案对 mod 的结果。 A. 对于所有长度为 𝑛 的,值域为 [1, 𝑚] 的整数序列 𝑎,计算 ∑ ∑ max𝑘 𝑗 =𝑖 𝑎𝑘 𝑛 𝑗=𝑖 𝑛 𝑖=1 之和。 B. 对于所有长度为 𝑚 的,值域为 [1, 𝑛] 的整数序列 𝑎,计算 ∑ ∑ max𝑘 𝑗 =𝑖 𝑎𝑘 𝑚 𝑗=𝑖 𝑚 𝑖=1 之和。 C. 对于所有长度为 𝑛 的,值域为 [1, 𝑚] 的整数序列 𝑎,计算 ∑ ∑ min𝑘 𝑗 =𝑖 𝑎𝑘 𝑛 𝑗=𝑖 𝑛 𝑖=1 之和。 D. 对于所有长度为 𝑚 的,值域为 [1, 𝑛] 的整数序列 𝑎,计算 ∑ ∑ min𝑘 𝑗 =𝑖 𝑎𝑘 𝑚 𝑗=𝑖 𝑚 𝑖=1 之和。
08-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银狐游戏开发资源2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值