1567C - Carrying Conundrum,P3758 [TJOI2017]可乐,P3802 小魔女帕琪,P3901 数列找不同

116 阅读3分钟

1567C - Carrying Conundrum

相邻位不会产生影响,会产生影响的只有间隔位,那就奇数位构成一个数,偶数位构成一个数,比如2021,奇数位a=22,偶数位b=1,a有23种方式构成((0,22),(1,21),,,(21,1),(22,0)),b有2种方式((0,1),(1,0)),就比如(2,20)和(0,1)这一对,就可以构成,2在奇数位所以奇数位填的数是0和2,这样算出来才是2,0在偶数位那偶数位就分别填0,0,这样就构成了x=0020,y也按照同样的方式构造出来就是2001,加起来正好时2021,因为题目要求的是正整数的个数,所以把0的去掉也就是(0,22)和(0,1)或(22,0)和(1,0)这两种去掉,所以最后的答案就是(a+1)*(b+1)-2

Carrying Conundrum(思维)_胡牧之.的博客-CSDN博客

ll t;
char s[12];
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%s",s+1);
        ll a=0,b=0,n=strlen(s+1);
        for(int i=1;i<=n;i++){
            if(i&1) a=a*10+s[i]-'0';
            else b=b*10+s[i]-'0';
        }
        ll ans=(a+1)*(b+1)-2;
        printf("%lld\n",ans);
    }
    return 0;
}

P3758 [TJOI2017]可乐 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 矩阵快速幂,邻接矩阵的含义

a[i][j]表示i和j之间有一条边,也可以看成是i走到j走了1步,那a^k下a[i][j]所代表的数字就可以看成是i走到j走了k步有多少方案,那么做完k次幂后,sum(a[1][i])就是答案,停留原地也就是每个点都有一个自环,自爆就相当于连上一个虚拟点0,每个点都可以走到0,但是0走不到任何点,最后统计答案就可以,要注意a[0][0]也是要等于1,不然a[1][0]就会少一种情况

题解 P3758 【[TJOI2017]可乐】 - Zhang_RQ 的博客 - 洛谷博客

struct Matrix{
    ll mat[32][32];
    Matrix operator*(const Matrix &a){
        Matrix res;
        memset(&res,0,sizeof(res));
        for(int i=0;i<=30;i++)
            for(int j=0;j<=30;j++)
            for(int k=0;k<=30;k++)
            res.mat[i][j]=(res.mat[i][j]+mat[i][k]*a.mat[k][j]%mod)%mod;
        return res;
    }
};
Matrix qpow(Matrix a,ll b){
    Matrix res;
    memset(&res,0,sizeof(res));
    for(int i=0;i<=30;i++) res.mat[i][i]=1;
    while(b){
        if(b&1) res=res*a;
        a=a*a;
        b>>=1;
    }
    return res;
}
ll n,m;
Matrix a;
int main(){
    memset(&a,0,sizeof(a));
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++){
        ll u,v;
        scanf("%lld%lld",&u,&v);
        a.mat[u][v]=a.mat[v][u]=1;
    }
    for(int i=0;i<=n;i++) a.mat[i][i]=1,a.mat[i][0]=1;
    ll ans=0,t;
    scanf("%lld",&t);
    Matrix res=qpow(a,t);
    for(int i=0;i<=n;i++) ans=(ans+res.mat[1][i])%mod;
    printf("%lld\n",ans);
    return 0;
}

P3802 小魔女帕琪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 概率

终于碰到一个概率题了,但是不会

假设7个晶石的总数为n,那么1-7可以放大招的概率为7!\frac{a1}{n}\frac{a2}{n-1}\frac{a3}{n-2}\frac{a4}{n-3}\frac{a5}{n-4}\frac{a6}{n-5}*\frac{a7}{n-6}​编辑,因为顺序可能会不一样所以要乘以7!,然后再考虑2-8可以放大招的概率就是7!\frac{a1}{n}\frac{a2}{n-1}\frac{a3}{n-2}\frac{a4}{n-3}\frac{a5}{n-4}\frac{a6}{n-5}\frac{a7}{n-6}*\frac{a1-1}{n-7}​编辑,当然最后一项也可能是a2-1/(n-7),,,a7-1/(n-7),将这些可能都加起来发现sum((ai-1)/(n-7))=1,所以概率是一样的,将这些加起来就是7!\frac{a1}{n}\frac{a2}{n-1}\frac{a3}{n-2}\frac{a4}{n-3}\frac{a5}{n-4}\frac{a6}{n-5}*a7​编辑,因为最后乘了个n-6;

P3802 小魔女帕琪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

double a[10],n=0;
int main(){
    double sev=1;
    for(int i=1;i<=7;i++)
        scanf("%lf",&a[i]),n+=a[i],sev*=i;
    double ans=sev*(a[1]/n)*(a[2]/(n-1))*(a[3]/(n-2))*(a[4]/(n-3))*(a[5]/(n-4))*(a[6]/(n-5))*a[7];
    printf("%.3lf\n",ans);
    return 0;
}

P3901 数列找不同 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

lm[i]表示i为右端点时符合条件的最小的值,那么如果询问的时候lm[r]<=l,那就说明区间内没有相同的,否则就是NO,如果a[i]没有出现过,那么lm[i]=lm[i-1],否则就是pos[a[i]]+1,预处理完后就查询就可以

题解 P3901 【数列找不同】 - ting_time 的博客 - 洛谷博客

ll pos[100005],n,q,lm[100005];
int main(){
    scanf("%lld%lld",&n,&q);
    for(int i=1;i<=100000;i++) pos[i]=0;
    for(int i=1;i<=n;i++){
        ll x;
        scanf("%lld",&x);
        lm[i]=max(lm[i-1],pos[x]+1);
        pos[x]=i;
    }
    for(int i=1;i<=q;i++){
        ll l,r;
        scanf("%lld%lld",&l,&r);
        if(lm[r]<=l) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}