Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

当小FF来到神庙时,神庙已经破败不堪了。但神庙的中央有一个光亮如新的石台。小FF走进石台, 发现石台上有一个数串,而数串

的上方刻着一串古老的符文之语。精通古符文之语的小FF不费吹灰之力就读懂了文章的意思,其大意是:对于石台上的一串数

字,你可以在适当的位置加入乘号(设加了k个,当然也可不加,即分成k+1个部分),设这k+1个部分的乘积(如果k=0,则乘

积即为原数串的值)对m的余数(即mod m)为x;现求x能达到的最小值及该情况下k的最小值,以及x能达到的最大值及该情况下

的k的最小值(可以存在x的最小值与最大值相同的情况)。小FF还知道,如果他找到了正确的答案,那么就可以通往神庙的下层

了。但这个问题似乎不太好解决,小FF就找到了你,并答应找到财宝以后和你二八分(当然你拿二……)。

【数据范围】

对于30%的数据:2≤字符串的长度L≤50。

对于100%的数据:2≤字符串的长度L≤1000;2≤m≤50。

【输入格式】

第一行为数串,且数串中不存在0; 第二行为m。

【输出格式】

四个数,分别为x的最小值和该情况下的k,以及x的最大值和该情况下的k,相邻两个数之间用以个空格隔开。

Sample Input

4421

22

Sample Output

0 1 21 0

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t098

【题解】



设f[i][j]表示前i个数字组成的数字%m的值为j时最少需要加入的乘号个数;

设mod[i][j]表示从第i到第j个数字组成的数字%m的值为多少;(这个可以用同余率搞出来);

令t = (j*mod[i+1][k])%m;

则f[k][t] = min(f[k][t],f[i][j]+1);

最后分别顺序枚举、倒序枚举一下i输出相应的f[n][i]就好;

这里状态的表示感觉不好想。

想出来后写代码就比较轻松了;



【完整代码】

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXL = 1100;
const int MAXM = 50+10;
const int INF = 0x3f3f3f3f; char s[MAXL];
int m,a[MAXL],len,mod[MAXL][MAXL];
int f[MAXL][MAXM]; int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%s",s+1);
rei(m);
len = strlen(s+1);
rep1(i,1,len)
a[i] = s[i]-'0';
rep1(i,1,len)
{
mod[i][i] = a[i]%m;
rep1(j,i+1,len)
mod[i][j] = ((mod[i][j-1])*10+a[j])%m;
}
memset(f,0x3f3f3f3f,sizeof f);
rep1(i,1,len)
f[i][mod[1][i]] = 0;
rep1(i,1,len)
rep1(j,0,m-1)
if (f[i][j]<INF)
{
rep1(k,i+1,len)
{
int t = (j*mod[i+1][k])%m;
f[k][t] = min(f[k][t],f[i][j]+1);
}
}
rep1(j,0,m-1)
if (f[len][j]<INF)
{
printf("%d %d ",j,f[len][j]);
break;
}
rep2(j,m-1,0)
if (f[len][j]<INF)
{
printf("%d %d\n",j,f[len][j]);
break;
}
return 0;
}

【t098】符文之语的更多相关文章

  1. [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)

    传送门 f[i][j]表示前i个数余数为j的最优解 sum[i][j]表示字符串i~j所构成的数 #include <cstdio> #include <cstring> #d ...

  2. P1774 最接近神的人_NOI导刊2010[树状数组 逆序对 离散化]

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...

  3. 洛谷P1774 最接近神的人

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...

  4. 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)

    To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...

  5. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  6. luogu P1774 最接近神的人_NOI导刊2010提高(02)

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...

  7. 洛谷 P1774 最接近神的人_NOI导刊2010提高(02)

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...

  8. 洛谷——P1774 最接近神的人_NOI导刊2010提高(02)

    https://www.luogu.org/problem/show?pid=1774 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古 ...

  9. 【t099】最接近神的人

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古 ...

随机推荐

  1. 24种编程语言的Hello World程序

    24种编程语言的Hello World程序 这篇文章主要介绍了 24 种编程语言的 Hello World 程序,包括熟知的 Java.C 语言.C++.C#.Ruby.Python.PHP 等编程语 ...

  2. 【51NOD1304】字符串的相似度

    题目描述 我们定义2个字符串的相似度等于两个串的相同前缀的长度.例如 "abc" 同 "abd" 的相似度为2,"aaa" 同 " ...

  3. Go语言开发教程

    Go语言简述 兴起:2009年Gogle发布的第二款开源编程语言 特征: 语法简单:语法标准比较严格,适合开发人员短时间高效的服务端开发. 并发模型:Goroutine是Go最显著的特征,使用类协程的 ...

  4. python世界里的局部变量和全局变量: 潜规则太重要了!!!

    python世界里的局部变量和全局变量: 潜规则太重要了!!! 先上代码: def fun(): def test_global(): ''' 内层和外层都需要声明为global, 才能彻底打通变量名 ...

  5. 火狐自动填写表单autofill forms的用法和注意事项

    1.安装后,打开要表单页面,右键

  6. JavaScript for循环 while循环

    循环可以将代码块执行指定的次数. JavaScript 循环 如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. 我们可以这样输出数组的值: 一般写法: documen ...

  7. 阿里云BaaS:降低区块链应用门槛,用技术构建商业互信

    5月8日,阿里云召开区块链服务(BaaS)商业化发布会,会上对BaaS产品.业务应用场景及生态策略进行了全面解读. 对于广大IT服务商和开发者而言,构建区块链应用存在三大痛点问题:成本高,研发投入大. ...

  8. oracle函数 add_months(d1,n1)

    [功能]:返回在日期d1基础上再加n1个月后新的日期. [参数]:d1,日期型,n1数字型 [返回]:日期

  9. oracle函数 NLS_LOWER(x[,y])

    [功能]返回字符串并将字符串的变为小写; [参数]x字符型表达式 [参数]Nls_param可选,指定排序的方式(nls_sort=) . SCHINESE_RADICAL_M(部首.笔画) SCHI ...

  10. uva 11174 Stand in a Line (排列组合)

    UVa Online Judge 训练指南的题目. 题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面.问一共有多少种方式. 做法是,对于每一个父节点,将它的儿子 ...