【数学】

【数学】

收录一些用 数学处理手法/纯数学计算推规律 的题目

最小值

https://acm.hdu.edu.cn/contest/problem?cid=1176&pid=1012

题目大意

7f57e1f4-019e-4cfe-a88c-ba7933947cfb

思路

【看到绝对值】第一个想法是去绝对值->分类讨论
【找序列两数相减绝对值最小排序,求差分,差分序列最小值
9c79d41e-2ad4-4299-828d-1ddb2d5e086d

代码

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个交点
一个线段可以把一个平面一分为二
image

#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

思路

直接换就可以->解方程
image

代码

#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
image
image
image

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

题目大意

QQ_1757149718867

思路:【辗转思想】

考虑状态 不需要考虑平局的情况
只需要考虑\(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;
}
posted @ 2025-01-17 23:39  White_ink  阅读(21)  评论(0)    收藏  举报