1455D - Sequence and Swaps
P1297 [国家集训队]单选错位 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
第i个题是否能对关键是看a[i]和a[i+1],如果a[i]==a[i+1],那么正确的概率就是1/a[i]或1/a[i+1],如果a[i]>a[i+1],那么a[i]中只有a[i+1]中答案才有可能是正确的,所以有a[i+1]/a[i]*1/a[i+1]=1/a[i];
如果a[i]<a[i+1],那么a[i+1]中只有a[i]中答案才是有用的,所以用a[i]/a[i+1]*1/a[i]=1/a[i+1];所以答案就是sum(1/max(a[i],a[i+1]);
题解 P1297 【[国家集训队]单选错位】 - stoorz 的博客 - 洛谷博客
ll A,B,C,n,a[10000007];
int main(){
scanf("%lld%lld%lld%lld%lld", &n, &A, &B, &C, a + 1);
for (int i = 2; i <= n; i++)
a[i] = ((long long) a[i - 1] * A + B) % 100000001;
double ans=0;
for (int i = 1; i <= n; i++)
a[i] = a[i] % C + 1;
for(int i=1;i<n;i++){
ans+=(double)(1.0/max(a[i],a[i+1]));
}
ans+=(double)(1.0/max(a[1],a[n]));
printf("%.3lf\n",ans);
return 0;
}
B-荒神在此_牛客练习赛101 (nowcoder.com) 递推
假设f[n-1]已经求出,那么f[n]就是需要在第n个下标上选择一个数填上,如果n是偶数的话,那么n是有n+1种选择,也就是f[n-1](n+1);如果n是奇数的话那么它可以选(n+1)/2种奇数或者偶数,选偶数是没有影响的,所以有f[n-1](n+1)/2种,另外f[n-1]总的是有n!种,那么f[n-1]可以选偶数,那么不符合的种数就是n!-f[n-1],这些就可以和(n+1)/2种奇数配成符合条件的序列,所以n是奇数的话会有(n+1)/2f[n-1]+(n!-f[n-1])(n+1)/2,化简一下就是(n+1)!/2;另外再看n为偶数的情况是f[n-1]*(n+1),n为偶数的话那么n-1就是奇数,所以f[n-1]=n!/2,所以f[n]=(n+1)!/2。所以f[n]=(n+1)!/2;
但是其实这题还可以感性的理解一下,a[1]是可以改变奇偶性的,所以无论后边怎么变,a[1]都可以将其变回偶数,所以就是(n+1)!/2
牛客练习赛101题解_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com)
#include <bits/stdc++.h>
#define ll long long
#define lowbit(i) (i)&(-i)
using namespace std;
const ll mod=998244353;
const ll inf=1e18;
const double eps=1e-8;
int qpow(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
ll lcm(ll a,ll b){
return a*b/__gcd(a,b);
}
bool cmp(ll a,ll b){return a>b;}
ll fac[10000007];
ll C(ll a,ll b){
return (fac[a]*getinv(fac[a-b])%mod)*getinv(fac[b])%mod;
}
ll n;
int main(){
fac[0]=1;
for(ll i=1;i<=10000000;i++) fac[i]=fac[i-1]*i%mod;
scanf("%lld",&n);
ll ans=0;
ll res=1,tm=2;
for(ll i=2;i<=n;i+=2){
res=res*(i+1LL)%mod;
}
ll invt=getinv(2LL);
for(ll i=3;i<=n;i+=2){
tm=tm*((i+1LL)*invt%mod)%mod;
}
ll x=n/2,ttm=tm*invt%mod;
if(n&1) x++;
for(ll i=1;i<=n/2+(n&1);i+=2){
ans=(ans+C(x-1LL,i)*tm%mod)%mod;
if(i>1LL){
ans=(ans+C(x-1LL,i-1LL)*ttm%mod)%mod;
}
else ans=(ans+ttm)%mod;
//cout<<i<<" "<<ans<<" "<<C(x-1LL,i)<<" "<<(x-1LL,i-1LL)<<endl;
}
ans=ans*res%mod;
printf("%lld\n",ans);
return 0;
}