1514C - Product 1 Modulo 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;
}