hdoj 4669 Mutiples on a circle

本文分享了一道环形动态规划题目解决方案,通过详细的代码解释了如何解决该问题,并记录了作者在解决过程中遇到的常见错误及调试经历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近都怀疑自己整天在做什么了!!!今天又是低级错误让我wa了一天,数组开小了,后来用随机数的方法,用程序产生了好多随机数结果有一组出错了,数据是3万多,还很郁闷,弄了好久,就是记录长度的数组开小了,然后导致变量的值改变了,联系到了以前学的汇编的知识,看了大学的课上了作用还是挺大的。。。今天和钢牛做比赛,没有A一题还贡献了无数的wa,忽然想起来以前刚刷题的时候因为不懂题意然后就各种情况都试了,结果wa了n次最终ac了,但是扣的时间太多了!!!无语了,继续我的刷题吧

下面试这道环形dp的代码,解析网上很详细,我也懒的说,最近是越来越懒了、、、、

/////////////////////////////////////////////////////////////////////////
// File Name: 4669().cpp
// Author: wang
// mail: 
// Created Time: 2013-8-19 9:41:28
/////////////////////////////////////////////////////////////////////////
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>

#include <algorithm>
#include<iostream>
#include<queue>
#include <map>
using namespace std;
typedef long long ll;
#define INF (INT_MAX/10)
#define SQR(x) ((x)*(x))
#define rep(i, n) for (int i=0; i<(n); ++i)
#define repf(i, a, b) for (int i=(a); i<=(b); ++i)
#define repd(i, a, b) for (int i=(a); i>=(b); --i)
#define clr(ar,val) memset(ar, val, sizeof(ar))
#define N 50001
#define M 201
ll dp[2][M];
int a[N];
int b[N*4];
int len[N];
int n,k,sum;
ll ans;
int Max=0;
int p[N];

int getlen(int i,int x)
{
    if(x<10) {p[i]=1; sum+=1; return 10;}
	if(x<100) {p[i]=2;sum+=2; return 100;}
	if(x<1000) {p[i]=3;sum+=3; return 1000;}
	sum+=4;
	p[i]=4;
	return 10000;
}

void init()
{
	sum=0;ans=0;
	memset(dp,0,sizeof(dp));
	rep(i,n)
		len[i]=getlen(i,a[i])%k;
	rep(i,n) a[i]%=k;
}
int main()
{
//	freopen("out.txt","r",stdin);
	while(~scanf("%d%d",&n,&k))
    {
		rep(i,n) scanf("%d",&a[i]);
		init();
	    b[0]=1;
		repf(i,1,sum) b[i]=b[i-1]*10%k;
		int mod=0,i;
		int now=1;
		repf(l,1,n)
		{
			if(l==n) i=0;
			else i=l;
			rep(j,k)
				dp[now][(j*len[i]%k+a[i])%k]+=dp[!now][j];
			mod=(mod*len[i]%k+a[i])%k;
			++dp[now][a[i]];
			now=!now;
			rep(j,k) dp[now][j]=0;
		} 
		ans+=dp[!now][0];
		repf(i,1,n-1)
		{
			dp[!now][mod]--;
			rep(j,k)
				dp[now][(j*len[i]%k+a[i])%k]+=dp[!now][j];
			++dp[now][a[i]];
			ans+=dp[now][0];
			now=!now;
			rep(j,k) dp[now][j]=0;
			//长度的
			mod=(mod-(b[sum-p[i]]*a[i])%k)%k;
		  //  mod=(mod-b[sum]*a[i]%k)%k;
			if(mod<0) mod+=k;
			mod=(mod*len[i]%k+a[i])%k; 
		}
        cout<<ans<<endl;
    }
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定的小Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值