1 条题解
-
0
自动搬运
来自洛谷,原作者为

Fire_flame
乐观乐观再乐观搬运于
2025-08-24 22:51:02,当前版本为作者最后更新于2023-05-06 22:03:06,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
分做法
写一个 dfs 暴力,可以拿到 分的好成绩。
分做法
不知道,期待比赛时有人拿到。
分做法
我们考虑构造,令 。
将 的子集分成两组 ,且满足 ,集合 里面去掉 之后等于 。
所以 $G(Q_i)=\sum\limits_{j=1}^{|Q_i|}Q_{i,j}\times(-1)^{j+1}=Q_{i,1}-Q_{i,2}+\dots$
$G(T_i)=\sum\limits_{j=1}^{|T_i|}T_{i,j}\times(-1)^{j+1}=T_{i,1}-T_{i,2}+T_{i,3}-\dots=n-Q_{i,1}+Q_{i,2}-\dots$
那么 。
故答案为 ,时间复杂度 。
分做法
因为模数是 ,大约是 ,所以在用快速幂求完 之后要用龟速乘乘上 ,不然 会爆
long long。没有用龟速乘或者提前取模 分。
标程:
#include<bits/stdc++.h>//by Fire_flame #define int long long using namespace std; const int MOD = 911451407; int n; int fpow(int a, int b){ int res = 1; while(b){ if(b & 1)res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; } int ftime(int a, int b){ int res = 0; while(b){ if(b & 1)res = (res + a) % MOD; a = (a + a) % MOD; b >>= 1; } return res; } signed main(){ scanf("%lld", &n); printf("%lld", ftime(fpow(2, n - 1), n)); return 0; }标程二:
#include<bits/stdc++.h>//代码提供者:OI_LOSER_CGY #define int long long using namespace std; int n,mod=911451407; signed main(){ scanf("%lld",&n); int res=n%mod,a=2;n--; while(n){ if(n%2)res=res*a%mod; a=a*a%mod,n/=2; } printf("%lld\n",res); return 0; }
- 1
信息
- ID
- 8732
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者