1514C - Product 1 Modulo N 逆元的性质,348A - Mafia 二分答案,POJ 3071,ZOJ 3640

115 阅读1分钟

1514C - Product 1 Modulo N 逆元的性质

如果ab1(modn)a*b\equiv 1(mod n) 那么ab互为逆元,那么a一定满足gcd(a,n)=1;

假设a是序列中的数,b是序列中其他数的乘积,因为总乘积取模n=1,也就是说总乘积与n互质,那么序列中的每个数都是与n互质的,那么我们把这些数全取之后看看乘积在模n意义下是否等于1就行,不等于1就把这个数删掉,因为原本是ansy%n=1,但ans不等于1,那就说明ansy%n=ans,所以不要最后一个数就可以了

C. Product 1 Modulo N(裴蜀定理、逆元)_ACfunhsl的博客-CSDN博客

ll n,vis[100005];
int main(){
    scanf("%lld",&n);
    ll ans=1,cnt=0;
    for(ll i=1;i<=n;i++)
        if(__gcd(i,n)==1) vis[i]=1,ans=ans*i%n,cnt++;
    if(ans!=1) cnt--,vis[ans]=0;
    printf("%lld\n",cnt);
    for(ll i=1;i<=n;i++)
        if(vis[i]) printf("%d ",i);
    return 0;
}

348A - Mafia 二分答案

没想到这题是一个二分,check函数也写得很霸道,每轮只有n-1个人能玩,所以就看看二分的轮数是否可以满足mid*(n-1)>=sum,sum是所有人要玩的轮数的总和

A. Mafia----二分答案_bless295的博客-CSDN博客

ll n,a[100005],sum=0;
bool check(ll x){
    return x*(n-1)>=sum;
}
int main(){
    scanf("%lld",&n);
    ll l=0,r=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        l=max(l,a[i]);
        r+=a[i];
        sum+=a[i];
    }
    ll ans=sum;
    while(l<=r){
        ll mid=l+r>>1;
        if(check(mid)) ans=mid,r=mid-1;
        else l=mid+1;
    }
    cout<<ans<<"\n";
    return 0;
}

Football - POJ 3071 - Virtual Judge (vjudge.net) 概率dp,全概率公式

【学习笔记】信息学竞赛中的概率与期望小结_ikrvxt的博客-CSDN博客

上面的博客讲了下全概率公式,耐心看会看懂的,概率论学的太差了都忘了是咋回事了。

题目中的踢足球比赛和全概率公式的条件是一样的,所以直接套公式求出每一个队伍获胜的概率,输出最大的那个就行,dp[i][j]表示在第i轮第j个队伍获胜的概率是多少

POJ 3071 Football (概率DP)_aozil_yang的博客-CSDN博客

ll n;
double a[130][130],dp[130][130];
int main(){
    while(scanf("%lld",&n)!=EOF){
        if(n==-1) break;
        ll len=(1<<n);
    for(int i=1;i<=len;i++)
        for(int j=1;j<=len;j++) scanf("%lf",&a[i][j]);
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=len;i++) dp[0][i]=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=len;j++)
    for(int k=1;k<=len;k++){
        if((((j-1)>>(i-1))^1)==((k-1)>>(i-1))) dp[i][j]+=dp[i-1][j]*dp[i-1][k]*a[j][k];
    }
    ll ans;
    double maxx=0;
    for(int i=1;i<=len;i++)
    if(maxx<dp[n][i]){
        maxx=dp[n][i];
        ans=i;
    }
    printf("%lld\n",ans);
    }
    return 0;
}

Help Me Escape - ZOJ 3640 - Virtual Judge (vjudge.net) 概率dp

题目没看懂,,,原来是f<=c[i]的话加上c[i]再重新实验,那么记忆化搜索就可以了,dp[f]表示战斗力为f可以走出去的天数的期望,然后根据题目记忆化搜索就行

ll n,f,c[105];
double dp[200005];
double dfs(ll f){
    if(dp[f]>0) return dp[f];
    dp[f]=0;
    for(int i=1;i<=n;i++){
        if(f>c[i]){
            ll t=(double)(sqrt(5)+1.0)*1.0*c[i]*c[i]/2;
            dp[f]+=t*1.0/n;
        }
        else{
            dp[f]+=(1+dfs(f+c[i]))/n;
        }
    }
    return dp[f];
}
int main(){
    while(scanf("%lld%lld",&n,&f)!=EOF){
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
        printf("%.3lf\n",dfs(f));
    }
    return 0;
}