A
偶数个相同的数异或为0,奇数个相同的数异或为这个数本身
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
mt19937 rnd(time(0));
#define int long long
typedef tuple<int,int,int> tp;
#define x first
#define y second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
constexpr int N=1000010,mod=998244353,inf=1e18;
constexpr double pi=3.1415926535897932384626,eps=1e-5;
const ll P=rnd()%mod;
#define all(a) a.begin(),a.end()
#define get_count(x) __builtin_popcount(x)
#define fors(i,a,b) for(int i=a;i<=b;i++)
#define forr(i,a,b) for(int i=b;i>=a;i--)
#define pb(x) push_back(x)
int dx[]={0,1,0,-1,1,1,-1,-1,0};
int dy[]={1,0,-1,1,1,-1,-1,1,0};
int random(int l,int r){return rand()%r+l;
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int __=1;
// cin >> __;while(__--){int x;cin >> x;cout << 0 << '\n';}system("color 04");return 0;
}
B
正数P和负数Q交叉来填,如果\(P==Q\)则为\(2*P\),否则为\(min(P,Q)*2+1\)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
mt19937 rnd(time(0));
#define int long long
typedef tuple<int,int,int> tp;
#define x first
#define y second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
constexpr int N=1000010,mod=998244353,inf=1e18;
constexpr double pi=3.1415926535897932384626,eps=1e-5;
const ll P=rnd()%mod;
#define all(a) a.begin(),a.end()
#define get_count(x) __builtin_popcount(x)
#define fors(i,a,b) for(int i=a;i<=b;i++)
#define forr(i,a,b) for(int i=b;i>=a;i--)
#define pb(x) push_back(x)
int dx[]={0,1,0,-1,1,1,-1,-1,0};
int dy[]={1,0,-1,1,1,-1,-1,1,0};
int random(int l,int r){return rand()%r+l;
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int __=1;
// cin >> __;while(__--){int n,m;cin >> n >> m;if(n==m) cout << 2*n << '\n';else cout << 2*min(n,m)+1 << '\n';}system("color 04");return 0;
}
C
把相同行的列数存在一起,把相同列的行数存在一起,最后查询
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
mt19937 rnd(time(0));
#define int long long
typedef tuple<int,int,int> tp;
#define x first
#define y second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
constexpr int N=1000010,mod=998244353,inf=1e18;
constexpr double pi=3.1415926535897932384626,eps=1e-5;
const ll P=rnd()%mod;
#define all(a) a.begin(),a.end()
#define get_count(x) __builtin_popcount(x)
#define fors(i,a,b) for(int i=a;i<=b;i++)
#define forr(i,a,b) for(int i=b;i>=a;i--)
#define pb(x) push_back(x)
int dx[]={0,1,0,-1,1,1,-1,-1,0};
int dy[]={1,0,-1,1,1,-1,-1,1,0};
int random(int l,int r){return rand()%r+l;
}
vector<int> e[N],b[N];
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int __=1;
// cin >> __;while(__--){int n,m;cin >> n >> m;for(int i=1;i<=m;i++){int x,y;cin >> x >> y;e[x].push_back(y);b[y].push_back(x);}int ans=0;for(int i=1;i<=n;i++){sort(all(e[i])),sort(all(b[i]));if(e[i].size()){ans=max(ans,e[i].back()-e[i][0]);}if(b[i].size()){ans=max(ans,b[i].back()-b[i][0]);}}cout << ans << '\n';}system("color 04");return 0;
}
D
将数组从小到大排序,sum记为前缀和,如果\(sum>=a_i-1\)说明可以凑出1-ai的所有数,否则不可以,最后判断sum是否大于等于n即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
mt19937 rnd(time(0));
#define int long long
typedef tuple<int,int,int> tp;
#define x first
#define y second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
constexpr int N=1000010,mod=998244353,inf=1e18;
constexpr double pi=3.1415926535897932384626,eps=1e-5;
const ll P=rnd()%mod;
#define all(a) a.begin(),a.end()
#define get_count(x) __builtin_popcount(x)
#define fors(i,a,b) for(int i=a;i<=b;i++)
#define forr(i,a,b) for(int i=b;i>=a;i--)
#define pb(x) push_back(x)
int dx[]={0,1,0,-1,1,1,-1,-1,0};
int dy[]={1,0,-1,1,1,-1,-1,1,0};
int random(int l,int r){return rand()%r+l;
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int __=1;cin >> __;while(__--){int n;cin >> n;vector<int> a(n+1);for(int i=1;i<=n;i++) cin >> a[i];sort(all(a));int sum=0;for(int i=1;i<=n;i++){if(sum>=a[i]-1){sum+=a[i];}}if(sum>=n) cout << "Cool!" << '\n';else cout << sum+1 << '\n';}system("color 04");return 0;
}
E
盒子模型 n-2小球,放m-1个盒子里有多少种方案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
mt19937 rnd(time(0));
#define int long long
typedef tuple<int,int,int> tp;
#define x first
#define y second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
constexpr int N=1000010,mod=1e9+7,inf=1e18;
constexpr double pi=3.1415926535897932384626,eps=1e-5;
const ll P=rnd()%mod;
#define all(a) a.begin(),a.end()
#define get_count(x) __builtin_popcount(x)
#define fors(i,a,b) for(int i=a;i<=b;i++)
#define forr(i,a,b) for(int i=b;i>=a;i--)
#define pb(x) push_back(x)
int dx[]={0,1,0,-1,1,1,-1,-1,0};
int dy[]={1,0,-1,1,1,-1,-1,1,0};
int random(int l,int r){return rand()%r+l;
}
class Com{
public:vector<int> f,uf;void init(int n){f.resize(n+1),uf.resize(n+1);}int qpow(int a,int b,int mod){int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;}void get_f(int n,int mod){f[0]=uf[0]=1;for(int i=1;i<=n;i++){f[i]=f[i-1]*i%mod;uf[i]=uf[i-1]*qpow(i,mod-2,mod)%mod;}}int get_C(int n,int m,int mod){if(n<m) return 0;return f[n]*uf[n-m]%mod*uf[m]%mod;}
};
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int __=1;cin >> __;Com C;C.init(N);C.get_f(N,mod);while(__--){int n,m;cin >> n >> m;cout << C.get_C(n-2,m-1,mod) << '\n';}system("color 04");return 0;
}
F
期望DP,推式子,首先,令f(i):从第i个字开始讲完这句话的期望。\(f_1=a_1/(a_1+b_1)*f_2+b_1/(a_1+b_1)*f_1+1\),移项求得\(f_1=1*f_2+(a_1+b_1)/a_1\),令\(P_1=1,Q_1=(a_1+b_1)/(a_1)\),\(f_2=a_2^2/(a_2+b_2)^2*f_3+2*a_2*b_2/(a_2+b_2)^2*f_2+b_2^2/(a_2+b_2)^2*f1\),同理整理得\(f2=a_2^2/(a_2^2+b_2^2-b_2^2*P_1)*f_3+Q_1*b_2^2+(a_2+b_2)^2/(a_2^2+b_2^2-b_2^2*P_1)\),化成一般式,\(f_i=P_i*f_(i+1)+Q_i\)。\(P_i=a^2/(a^2+b^2-b^2*P_(i-1))\),\(Q_i=Q_(i-1)*b^2+(a+b)^2/(a^2+b^2-b^2*P_(i-1))\)。从而可以预处理掉P和Q,那么\(f_i=p_i*f_(i+1)+q_i\),初始化\(f_n=1\),则倒序枚举最后输出\(f_1\)即为答案。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
mt19937 rnd(time(0));
#define int long long
typedef tuple<int,int,int> tp;
#define x first
#define y second
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
constexpr int N=1000010,mod=1e9+7,inf=1e18;
constexpr double pi=3.1415926535897932384626,eps=1e-5;
const ll P=rnd()%mod;
#define all(a) a.begin(),a.end()
#define get_count(x) __builtin_popcount(x)
#define fors(i,a,b) for(int i=a;i<=b;i++)
#define forr(i,a,b) for(int i=b;i>=a;i--)
#define pb(x) push_back(x)
int dx[]={0,1,0,-1,1,1,-1,-1,0};
int dy[]={1,0,-1,1,1,-1,-1,1,0};
int random(int l,int r){return rand()%r+l;
}
int qpow(int a,int b,int mod){int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int __=1;
// cin >> __;while(__--){int n;cin >> n;vector<int> a(n),b(n),f(n+1),p(n),q(n);for(int i=1;i<n;i++) cin >> a[i];for(int i=1;i<n;i++) cin >> b[i];p[1]=1,q[1]=(a[1]+b[1])%mod*qpow(a[1],mod-2,mod)%mod;for(int i=2;i<n;i++){int x=a[i],y=b[i];int A=x*x%mod,B=y*y%mod,C=(x+y)%mod*(x+y)%mod;int t=((A+B)%mod-B*p[i-1]%mod+mod)%mod;p[i]=A*qpow(t,mod-2,mod)%mod;q[i]=(q[i-1]*B%mod+C)%mod*qpow(t,mod-2,mod)%mod;}f[n]=1;for(int i=n-1;i>=1;i--){f[i]=(f[i+1]*p[i]%mod+q[i])%mod;}cout << f[1] << '\n';}system("color 04");return 0;
}