#include<bits/stdc++.h>usingnamespace std;int T, u, v, lca;intmain(){freopen("point.in","r", stdin);freopen("point.out","w", stdout);ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> T;for(int i =1;i <= T;i ++){
cin >> u >> v >> lca;
cout << u + v -2* lca << endl;}return0;}
T3:
:
因为 的范围,导致不能暴力枚举。实际上, 和 都存在一个性质:
这是两个 可重复贡献问题,考虑开 个 表分别进行求解。
需要注意的是本题代码有重复的地方,可以写完求 的表之后复制粘贴改成 ,调用时也是同理。
程序:
#include<bits/stdc++.h>usingnamespace std;int n, q, x, a, b, ans1, ans2, f1[50001][51], f2[50001][51];intmain(){freopen("determine.in","r", stdin);freopen("determine.out","w", stdout);scanf("%d%d",&n,&q);for(int i =1; i <= n; i++){scanf("%d",&x);
f1[i][0]= f2[i][0]= x;}for(int j =1;1<< j <= n; j++){for(int i =1; i +(1<< j)-1<= n; i++){
f1[i][j]=max(f1[i][j -1], f1[i +(1<< j -1)][j -1]);
f2[i][j]=min(f2[i][j -1], f2[i +(1<< j -1)][j -1]);}}for(int i =1; i <= q; i++){scanf("%d%d",&a,&b);if(a > b)swap(a, b);int k =log2(b - a +1);
ans1 =max(f1[a][k], f1[b -(1<< k)+1][k]);
ans2 =min(f2[a][k], f2[b -(1<< k)+1][k]);printf("%d\n", ans1 - ans2);}return0;}
T4:
:
由于不考虑顺序,可以转化为求 ,这是一个标准的 定理,直接套用模板求解。
程序:
#include<bits/stdc++.h>usingnamespace std;typedeflonglongll;
ll a[100001];int p;
ll pow(ll y,intz,intp){
y %= p;
ll ans =1;for(int i = z;i ;i >>=1, y = y * y % p)if(i &1)
ans = ans * y % p;return ans;}
ll C(ll n,ll m){if(m > n)return0;return((a[n]*pow(a[m], p -2, p))% p *pow(a[n - m], p -2, p)% p);}
ll Lucas(ll n, ll m){if(!m)return1;returnC(n % p, m % p)*Lucas(n / p, m / p)% p;}inlineintread(){int f=1,x=0;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');return f*x;}intmain(){freopen("choosing.in","r", stdin);freopen("choosing.out","w", stdout);int T =read();while(T --){int n =read(), m =read();
p =read();
a[0]=1;for(int i =1;i <= p;i ++)
a[i]=(a[i -1]* i)% p;
cout<<Lucas(n + m, n)<< endl;}}