题意:
内存限制:1000K
我们定义一个合法的K进制数为一个不含连续两个零的K进制数。
例如:
1010230 是一个合法的7位数。
1000198 不是合法的数。
0001234 不是7位数,是一个合法的4位数。

给你N,和K,M求出N位的K进制数的总数模M的值

这个是Version 3的翻译,其实建议直接做Version 3,当然,如果想感受一下这个好题的魅力,可以从第一题一直做到第三题,下面讲讲每个部分

  • Version 1

    可以发现数据范围很小,这意味着答案并不会很大,考虑用递推的办法解决问题,设f[i]为k进制下i位的答案,那么开始寻求递推公式,注意这里很重要,后面两个题的解决都和这一个公式有着很大的关系。
    我们先考虑当前这一位的决策,取0或不取0,不取0的情况是一定成立的,那么如果取0的话,i-1位一定不能取0,那么第i位取0的情况就只能搭配(f[i-2]*(k-1))这就是i-1位不为0的情况,然后直接推就好了

#include <cstdio>
#include <algorithm>const int N = 20;
typedef long long LL;#define rep(i, s, t) for(LL i = s; i <= t; ++i)LL f[N];
int main() {
#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("res.out", "w", stdout);
#endif LL n, k;scanf("%lld%lld", &n, &k);f[1] = k-1;rep(i, 2, n)f[i] = (f[i-1]+f[i-2])*(k-1);printf("%lld\n", f[n]+f[n-1]);return 0;
}
  • Version 2
    同样的,还是可以采用1的方法,但是发现会超LL(其实数据不会但是别水好吧。。)我们就直接一波高精度秒
#include <cstdio>
#include <cstring>const int N = 2000 + 10;
const int Mod = 1e4;
#define max(a, b) a>b?a:b
#define rep(i, s, t) for(int i = s; i <= t; ++i)
#define dec(i, s, t) for(int i = s; i >= t; --i)struct BN {int x[N], len;BN() {len = 0, memset(x, 0, sizeof x);}void operator = (int d) {x[0] = d; len = 1;}void update() {rep(i, 0, len-1)if(x[i] >= Mod) x[i+1] += x[i]/Mod, x[i] %= Mod;while(x[len]) len++;}void print() {printf("%d", x[len-1]);dec(i, len-2, 0) printf("%.4d", x[i]);puts("");}
}Temp, f[N];BN operator + (BN a, BN b) {Temp.len = max(a.len, b.len);rep(i, 0, Temp.len-1) Temp.x[i] = a.x[i]+b.x[i];Temp.update();return Temp;
}
BN operator * (BN a, int d) {rep(i, 0, a.len-1) a.x[i] *= d;a.update(); return a;
}int n, k;
int main() {
#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("res.out", "w", stdout);
#endifscanf("%d%d", &n, &k);f[0] = 1;f[1] = k-1;rep(i, 2, n) f[i] = (f[i-1]+f[i-2])*(k-1);f[n].print();return 0;
}

调试是出现了不明未知错误,用比较黑暗的办法强行过的,当然不是打表。

  • Version 3
    好吧发现这个题给了模数,那当然好,但是发现n,k特别大,于是就只能矩阵快速幂,考虑用第一问的矩阵构造单位矩阵, 如下图
    f[i-2],f[i-1] — 0 k-1 f[i-1],f[i]
    f[i-1],f[i] — 1 k-1 f[i],f[i+1]
    其实和斐波那契差不多,稍作改变就好;
    有一个坑点,模数范围很大,需要使用快速加法,否则会爆LL,快速加法就是将乘法用类似快速幂的思想解决具体见代码
#include <cstdio>
#include <cstring>typedef unsigned long long LL;#define rep(i, s, t) for(int i = s; i <= t; ++i)LL n, k, Mod, f[3];
struct Matrix { LL x[2][2];Matrix() {memset(x, 0, sizeof x);}void pre() {x[0][0] = 0;x[1][0] = 1;x[0][1] = x[1][1] = (k-1)%Mod;}
}unit;LL multy(LL a, LL b) {LL Ans = 0;for(; b; b >>= 1LL) {if(b & 1) Ans = (Ans+a)%Mod;a = (a+a) % Mod;}return Ans%Mod;
}Matrix operator * (Matrix a, Matrix b) {Matrix Ans;rep(i, 0, 1)rep(j, 0, 1) rep(k, 0, 1)Ans.x[i][j] = (Ans.x[i][j]+multy(a.x[i][k], b.x[k][j]))%Mod;return Ans;
}Matrix operator ^ (Matrix a, LL d) {Matrix Ans = a;for(--d; d; d >>= 1LL, a=a*a)if(d & 1LL) Ans = Ans*a;return Ans;
}void solve() {unit.pre();unit = unit ^ (n-2);unit.x[0][1] %= Mod;unit.x[1][1] %= Mod;printf("%llu\n", (multy(f[1], unit.x[0][1])%Mod+multy(unit.x[1][1], f[2])%Mod)%Mod);
}int main() {
#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("res.out", "w", stdout);
#endifwhile(~scanf("%llu%llu%llu", &n, &k, &Mod)) {f[1] = (k-1)%Mod;f[2] = multy(k, k-1)%Mod;if(n == 2) printf("%llu\n", f[n]%Mod);else solve();}return 0;
}

转载于:https://www.cnblogs.com/pbvrvnq/p/8530152.html

URAL K-based Numbers(1-3)相关推荐

  1. ural 1009 K-based Numbers

     1009. K-based Numbers Time limit: 1.0 second Memory limit: 64 MB Let's consider K-based numbers, ...

  2. 递推DP URAL 1586 Threeprime Numbers

    题目传送门 1 /* 2 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 3 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 4 ...

  3. ural 1009. K-based Numbers - dp

    1009. K-based Numbers Let's consider K-based numbers, containing exactlyN digits. We define a number ...

  4. Ural 1009 K-based Numbers

    1009. K-based Numbers Time limit: 0.5 second Memory limit: 64 MB Let's considerK-based numbers, cont ...

  5. URAL 1009. K-based Numbers

    /*这题貌似就是找规律. f1 = k-1; f2 = k*k - k; f3 = (f1 + f2) * (k-1); //(k-1)表示首位不为0的个数,比如n = 3时, 首位可能是1, 2, ...

  6. URAL 1013 K-based Numbers. Version 3

    URAL_1013 和URAL_1009的思路是一样的,只不过需要高精度,所以就直接用java写了.具体的一些思路可以参考我的URAL_1009的题解:http://www.cnblogs.com/s ...

  7. URAL 1233 Amusing Numbers 好题

    参照了nocow上的解法,照搬过来-- 易知一个数X在数列中在另一个数Y前,当且仅当X前缀小于Y或前缀相等X短,那么我们分布考虑,比如对于数48561: 5位上:10000~48560; 4位上:10 ...

  8. Ural 1558 - Periodical Numbers 写吐的水题...

    题意: (abc)代表abc无穷的循环....问(a1a2a3....)+(b1b2b3...)的值是多少..表示为(...)**的形式(前面是循环的..后面小段不循环的) 题解 练习赛的时候想得有点 ...

  9. URAL 1009 K-based Numbers (DFS)

    #include <stdio.h>int numOfDigits, base; int result;void isValid(int digits, int preDigit){if ...

  10. ural 1012K-based Numbers. Version 2 1013. K-based Numbers. Version 3

    1013. K-based Numbers. Version 3 Time Limit: 2.0 second Memory Limit: 64 MB Let's consider K-based n ...

最新文章

  1. IDEA IntelliJ 如何给web项目配置tomcat
  2. 关于delphi中的register, pascal, cdecl, stdcall, safecall
  3. 十个问题弄清JVMGC(二)
  4. 我ABAP开发生涯中搜集的一些有意思的数据库表
  5. python dicom 器官分割_python+opencv阈值分割
  6. 阿里巴巴公布“新六脉神剑”:因为信任 所以简单
  7. 一路走来一路歌—我和团队有个约会
  8. scala-jdbc-scalike操作jdbc数据库
  9. sql服务器密码如何显示,如何查看sql数据库密码
  10. BAT文件里注释符号
  11. 制造行业mes使用说明书_mes系统操作手册完整版
  12. 杭电(杭州电子科技大学)可视计算基础大作业:绝地求生吃鸡预测
  13. Docker 错误 “port is already allocated” 解决方法
  14. 卡拉赞服务器延迟,卡拉赞开荒详细功略(前门)
  15. 小程序二进制图片 buffer存储_可能没有想象的那么美好——微信小程序存储占用与清理实测...
  16. best-time-to-buy-and-sell-stock
  17. java大学生网上请假系统ssm框架
  18. Markdown语法笔记
  19. 回顾《JavaScript高级程序设计》目录篇
  20. 第0课 课前必读(未完成)

热门文章

  1. 12月22日 冬至 隋文帝赏柳上上签
  2. P1113 杂务 拓扑排序
  3. sublime text3 快捷方式汇总
  4. js 如何在浏览器中获取当前位置的经纬度
  5. iOS NSData简单解析
  6. 高级javascript---严格模式
  7. Android输入法
  8. 防火墙软件 - IPCop
  9. 分享两款迷你FTP服务器
  10. 开发-数据库-MongoDB初探