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!,然后再考虑2-8可以放大招的概率就是
编辑,当然最后一项也可能是a2-1/(n-7),,,a7-1/(n-7),将这些可能都加起来发现sum((ai-1)/(n-7))=1,所以概率是一样的,将这些加起来就是
编辑,因为最后乘了个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;
}