其他分享
首页 > 其他分享> > 20211018地狱模拟赛

20211018地狱模拟赛

作者:互联网

好的晚自习这么早就跑过来干博客了,今天还在努力的改昨天的题;

昨天考的那叫一个惨呀,30分,第一题不会逆元放弃,第二题暴力都写挂了只有搜索有10分,第三题暴力勉强20分啊啊啊~~~痛苦~~~

好的今天总结一下常见的数学知识:

第一题:

每一个点在一前面出现的概率为ai/(ai+a1),

所以答案为∑ni=2    ai*ai/(ai+a1)+1,我们就把式子同分,然后再求逆元取模,

而求逆元又是一个重点,逆元有三种求法,拓欧,费马,线性推,

在这里的连加上还有一种方法参考洛谷逆元2,只用跑一次快速幂

接下里就十分简单了:

#include<bits/stdc++.h>
using namespace std;
const long long N=1e7;
const long long p=1e9+7;
long long a[N],fac[N],ifac[N];
inline long long read()
{
    static char ch;
    long long res=0,sign=1;
    while((ch=getchar())<'0'||ch>'9'){
        if(ch=='-') sign=-1;
    }
    res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9'){
        res=res*10+ch-'0';
    }
    return res*sign;
}
long long Inv(long long x,long long a){
    long long ans=1;
    while(x){
        if(x&1){
            ans=(long long)ans*a%p;
        }
        a=(a*a)%p;
        x>>=1;
    }
    return ans%p;
}
signed main()
{
    long long n;
    n=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    long long res=a[1];
    fac[1]=1;
    for(int i=2;i<=n;i++) fac[i]=(fac[i-1]*(a[i]+a[1])%p)%p;
    ifac[n]=Inv(p-2,fac[n]);
    for(int i=n-1;i;i--) ifac[i]=(ifac[i+1]*(a[i+1]+a[1])%p)%p;
    for(int i=2;i<=n;i++) ifac[i]=(ifac[i]*(fac[i-1])%p)%p;
    for(int i=2;i<=n;i++) {
        res=(res+(a[i]*a[i])%p*ifac[i]%p)%p;
    }
    printf("%lld",res);
}

然后是第二题,我就暴力求了一个逆序对可以友20分,然而我只有10分

具体实现要用dp 但是我还没有搞懂,先咕着;

 

标签:ch,20,暴力,ai,20211018,逆元,long,地狱,模拟
来源: https://www.cnblogs.com/sszxlcy/p/15426084.html