【数学】
【数学】
收录一些用 数学处理手法/纯数学计算推规律 的题目
最小值
https://acm.hdu.edu.cn/contest/problem?cid=1176&pid=1012
题目大意
思路
【看到绝对值】第一个想法是去绝对值->分类讨论
【找序列两数相减绝对值最小】排序,求差分,差分序列最小值
代码
const int N=3e5+10;
int n;
/*
(ap-bp)-(aq-bq)
(ap+bp)-(aq+bq)
*/
void solve(){
cin>>n;
vector<i64> a(n+1,0),b(n+1,0);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
vector<i64> c(n+1,0),d(n+1,0);
for(int i=1;i<=n;i++){
c[i]=a[i]-b[i];
d[i]=a[i]+b[i];
}
i64 ans=inf_i64;
//找的是最小值!
sort(c.begin()+1,c.end(),cmp64);
sort(d.begin()+1,d.end(),cmp64);
for(int i=1;i<n;i++){
ans=min64(ans,c[i+1]-c[i]);
ans=min64(ans,d[i+1]-d[i]);
}
cout<<ans<<endl;
}
圆神启动
https://ac.nowcoder.com/acm/contest/98983/C
一个圆与另一个圆最多有2个交点
一个线段可以把一个平面一分为二
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1010;
int n;
ll a[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
ll tmp=2;
a[1]=1;
for(int i=2;i<=N;i++){
a[i]=a[i-1]+tmp;
tmp+=2;
}
cout<<a[n]+1;
return 0;
}
连分数
【求极限】
https://ac.nowcoder.com/acm/contest/91355/B
思路
直接换就可以->解方程
代码
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef pair<int,int> PII;
typedef long long ll;
typedef long double ld;
ll abss(ll a){return a>0?a:-a;}
ll max_(ll a,ll b){return a>b?a:b;}
ll min_(ll a,ll b){return a<b?a:b;}
bool cmpll(ll a,ll b){return a>b;}
int t;
ld a;
ld f(ld x){
ld res=(a+sqrt(a*a+4))/2;
return res;
}
void solve(){
cin>>a;
ld ans=f(a);
cout<<fixed<<setprecision(15)<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--) solve();
return 0;
}
2^a b^2
https://atcoder.jp/contests/abc400/tasks/abc400_c
ll n;
void solve(){
cin>>n;
ll cnt1=sqrtl(n/2),cnt2=sqrtl(n/4);
ll ans=cnt1+cnt2;
cout<<ans;
}
【概率题】
Game
https://codeforces.com/gym/105358/problem/G
题目大意
思路:【辗转思想】
考虑状态 不需要考虑平局的情况
只需要考虑\(x>y\)或\(x<y\)的情况
发现\(x:=x-y\)或\(y:=y-x\)是一个重复的过程->转化为相减
->考虑递归地求解,直到边界状态:x==y
时有答案Pa
代码
i64 x,y,a0,a1,b;
i64 pa,pb,pbinv;
i64 dfs(i64 x,i64 y){
if(x==y){
return pa;
}
if(x<y){
i64 k=y/x;
if(y%x==0) k--;//保证是第一次减后的结果,否则会直接判赢
return dfs(x,y-k*x)*qmi(pa,k,mod)%mod;
}
else if(x>y){
i64 k=x/y;
if(x%y==0) k--;
//Bob没连续赢的概率+(Bob连续赢的概率*子状态)
return ((dfs(x-k*y,y))%mod*qmi(pb,k,mod)%mod+(1LL-qmi(pb,k,mod)+mod)%mod)%mod;
}
}
void solve(){
cin>>x>>y>>a0>>a1>>b;
b=a0+a1;
pa=a0*qmi(b,mod-2LL,mod)%mod;
pb=a1*qmi(b,mod-2LL,mod)%mod;
pbinv=qmi((1LL-pb+mod)%mod,mod-2LL,mod);
i64 ans=dfs(x,y);
cout<<ans<<endl;
}