社区讨论

救救萌新!

P1773符文之语参与者 3已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi869mlo
此快照首次捕获于
2025/11/21 09:19
4 个月前
此快照最后确认于
2025/11/21 09:51
4 个月前
查看原帖
萌新自己想了个办法 然后有两个点过不了
f[i][j][k]表示前i位数余数为j 前半部分的余数为k时所需乘号最少
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rg register
#define lson o<<1
#define rson o<<1|1
#define Max(x,y) (x)>(y)?(x):(y)
#define Min(x,y) (x)>(y)?(y):(x)
const int N=1000+5,M=200000+5,inf=0x3f3f3f3f,P=19650827;
int m,n,w[N],mo[N],f[N][60][60],mxm=0,mnm=inf,ans1,ans2;
char a[N];
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int main(){
//	freopen("in.txt","r",stdin);
	scanf("%s",a);scanf("%d",&m);
	n=strlen(a);
	for(int i=0;i<n;++i) w[i+1]=a[i]-'0',mo[i+1]=(mo[i]*10+w[i+1])%m;
	memset(f,inf,sizeof(f));
	for(int i=1;i<=n;++i) f[i][mo[i]][1]=0;
	for(int i=2;i<=n;++i){
		for(int j=0;j<m;++j)
			for(int k=0;k<m;++k){
			f[i][(j*w[i])%m][(k*j)%m]=Min(f[i][(j*w[i])%m][(k*j)%m],f[i-1][j][k]+1);//加
			f[i][(10*j+k*w[i])%m][k]=Min(f[i][(10*j+k*w[i])%m][k],f[i-1][j][k]);//不加
			}
	}
	for(int i=0;i<m;++i)
	for(int j=0;j<m;++j)
	if(f[n][i][j]!=inf){
 		if(mnm>i) mnm=i,ans1=inf;if(mnm==i) ans1=Min(ans1,f[n][i][j]);
		if(mxm<i) mxm=i,ans2=inf;if(mxm==i) ans2=Min(ans2,f[n][i][j]);
	}
	printf("%d %d %d %d",mnm,ans1,mxm,ans2);
    return 0;
}

回复

13 条回复,欢迎继续交流。

正在加载回复...