URAL K-based Numbers(1-3)

OpenCV形状检测 开始定义我们的ShapeDetector类。我们将跳过这里的init构造函数,因为不需要初始化任何东西。#导入必要的包importcv2classShapeDetector#初始化形状名称并近似轮廓shape="unidentified"peri=cv2.arcLength(c,True)approx=cv2.approxPolyDP(c,0.04*peri,True)我们的检测方法,它只需要一个参数c,即我们试图识别的形状的轮廓。... 阅读详情

题意:
内存限制: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_JUDGE
    freopen("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_JUDGE
    freopen("input.in", "r", stdin);
    freopen("res.out", "w", stdout);
#endif
    scanf("%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_JUDGE
    freopen("input.in", "r", stdin);
    freopen("res.out", "w", stdout);
#endif
    while(~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;
}
tkinter动态表格 - 实时更新数据(TkinterTable) tkinter动态表格 - 实时更新数据(TkinterTable) 参考 [TkinterTable] Tkinter上的表格GUI】 https://github.com/dmnfarrell/tkintertable/wiki/Usage https://github.com/dmnfarrell/tkintertable/issues/47 python使用tkinter编写一个数据显示窗口(实时显示更新的数据) 首先安装TkinterTable,即pip install tki 阅读详情

相关推荐

Ubuntu22.04下安装LDAP

在Ubuntu22.04的时候可以使用apt的方式来安装,在安装LDAP的web 服务器的时候可以考虑选择 LDAP 帐户管理器 (LAM)。因为 PHPLDAPadmin 安装时需要 php 的环境依赖,相对来说安装麻烦。此外在 PHPLDAPadmin 中创建组织和用户时与平常的语法有很大不同,对新手来说不友好。

dl_11的博客 3944

连续零------------输入两个正整数a和b,S为a到b之间(包含a、b)所有整数的乘积,求s末尾从个位开始有多少个连续的0。

信息学邀请赛试题

weixin_43766920的博客 2205

UE5垃圾回收优化实战:定位GC卡顿与内存泄漏

垃圾回收(GC)是Unreal Engine 5中保障UObject内存安全的核心机制,其基于引用图的标记-清除原理决定了性能高度依赖引用结构合理性。当GC频繁触发或单次耗时突增,往往映射出蓝图强引用冗余、C++根对象管理失控或资源生命周期设计缺陷等底层问题。技术价值在于降低主线程阻塞、稳定60帧体验、抑制内存异常增长;典型应用场景包括关卡切换卡顿、UI打开后持续GC、打包后内存不释放等。本文聚焦UE5特有的Full GC模式、UObject生命周期约束及GC触发时机不可见性,提供从蓝图变量规范、TSoft

weixin_31995251的博客 362

2018第九届蓝桥杯个人赛省赛(软件类)C++A组试题第三题

一【题目描述】 标题:乘积尾零 如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 ...

充满好奇的threecat 284

CS1237卡尔曼滤波实战:如何用24位ADC实现电子秤级精度?

本文详细介绍了如何利用CS1237 24位ADC芯片结合卡尔曼滤波算法实现电子秤级精度测量。通过解析CS1237硬件特性、卡尔曼滤波原理及STM32驱动优化,提供了一套完整的解决方案,包括多通道支持、驱动代码实现和性能调优技巧,适用于工业测量和嵌入式开发领域。

linux的博客 1087

AI:Coze、Dify、n8n:三款低代码工具如何选?

Coze、Dify、n8n:三款低代码工具如何选?

Kant2048的博客 2806

连续零

题号: 10502 时限:1000ms 限制内存:32768KB 题目: 连续零 描述 输入两个正整数a和b,S为a到b之间(包含a、b)所有整数的乘积,求s末尾从个位开始有多少个连续的0。 比如a=1,b=7,那么s=1*2*3*4*5*6*7=5040,答案就是1,不是2。 输入格式 一行两个正整数,分别表示a和b(1&lt;=a,b&lt;=10^6)。 输出格式 输出一行一个...

君子不器 1284

零中频架构实战:用Matlab模拟AD9361收发信号(附完整代码)

本文详细介绍了如何使用Matlab模拟AD9361射频收发器的零中频架构,解决镜像干扰等关键挑战。通过完整的代码示例和系统级建模方法,帮助工程师掌握RFIC设计中的自适应校准算法和性能优化技巧,特别适用于SDR系统开发。

weixin_30733003的博客 541

零

从零开始,点点积累。 转载于:https://blog.51cto.com/mairv/688621

weixin_33719619的博客 106

基于深度学习YOLOv10的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

本文介绍了如何基于YOLOv10实现一个人脸表情识别系统。我们从数据集准备、模型训练到PySide6界面实现进行了详细的讲解。通过该系统,用户可以实时检测和分类人脸表情,为情感分析、智能交互等应用场景提供支持。

YOLO 1053

图解ADAS电源系统架构:看懂这张图,搞懂前装摄像头的供电秘密!

别以为ADAS系统就是“摄像头 + SoC”,其实最难搞的是供电系统,尤其是要满足车规级ASIL-D安全等级时。供电时序、电压稳定性、电源监控、冗余通信链路,一个都不能少。😤一旦电源选型不对,轻则系统卡顿,重则全车失控,不是闹着玩的。

weixin_43199439的博客 672

ural 1009 1012 1013 K-Based Numbers V1.0/2.0/3.0

<br />看来我就是讨厌麻烦的题啊...跳过去这么多实现题...<br />不过此题在思路上和实现上均不难.<br />我的代码里:<br />A[i]=满足条件的i位数中末尾不为0的, B[i]=满足条件的i位数中末尾为0的.<br />那么递推方程就很简单了:<br />A[i]=(A[i-1]+B[i-1])*(k-1)<br />B[i]=A[i-1]<br />结果是A[n]+B[n].<br />其实搞了半天我们发现B[i]的存在就是多余的, 直接A[i]=(A[i-1]+A[i-2])*(k

Tractatus Logico-Philosophicus 825

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

ural 1013 K-based Numbers. Version 3

题意:K-based Numbers. Version 3系列3~ 题意不多说,跟前两个系列一个意思。。。只不过要高精度了 发现一个很叼的现象。。。ural上加system("pause")不影响测评啊。。。好像poj上也不影响。。。。。? 还发现一个很叼的事情。。。Virtual Judge就是开了五个ID:Huang HanSheng,Zhang YiDe,。。。。啊。。。。好叼啊。。。。

jasison 774

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ural 1009 K-based Numbers

。

大咸鱼。。。 878

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Ural 1009. K-based Numbers DP

1009. K-based Numbers Time limit: 1.0 second Memory limit: 64 MB Let’s consider K-based numbers, containing exactly N digits. We define a number to be valid if itsK-based notation doesn’t c

停不下的脚步 1389

Ural 1009 K-based Numbers

1009. K-based Numbers Time limit: 0.5 second Memory limit: 64 MB Let’s consider K-based numbers, containing exactly N digits. We define a number to be valid if its K-based notation doesn’t c

getAC 751

URAL 1009. K-based Numbers

开始跟着BTW做DP题。。计算几何我还会一直学的,DP也同步学吧。BTW推荐的URAL这个。。。分类里有几十道DP。。。任重而道远~!这个水题哈,想了会儿,拿K=2模拟了下,发现基本和斐波那契数列差不多。在n,k下,第二位为1的情况等于在n-2,k的情况 + n-1,k的情况,再乘以首位不为0的情况(k-1)。。。开始一直拿2模拟的,忘记乘以首位不为0的了,N,K输入次序搞反了,WA得一塌糊涂T T 。。。int盛不下,long long可以。#include #include #include

小媛在努力~ 1940

URAL1009 K-based Numbers

Description Let’s consider K-based numbers, containing exactly N digits. We define a number to be valid if its K-based notation doesn’t contain two successive zeros. For example: 1010230 is a valid

Megumin的博客 390

ural 1013 K-based Numbers. Version 3(升级版)

DP: dp[i] = (dp[i - 1] + dp[i - 2]) * (k - 1) 推的过程见1009. K-based Numbers 但是由于n + k 构造一个矩阵A如下图,一个矩阵B如下图 那么A*B会发生以下奇妙的事情…………算算就知道 结果就是A^(n - 1) * B得到的矩阵的第一列相加 用矩阵快速幂很快就解出 因为模的M也是10^18级数的,容易

getAC 561

ural1012 K-based Numbers. Version 2

额。。。。。有了之前的那题。。。。。。。这题简直就是裸考了一个大数加法嘛。。。。。。。。。。 其余思想见URAL1009.。。。。。 #include int main() { int a[2000] = {0}, b[2000] = {0}, c[2000] = {0}; int g, i, j, m = 1; int n, k; scanf("%i %i",&n,&

生成猫 307

URAL - 1009 - K-based Numbers (简单DP)

1009. K-based Numbers Time limit: 1.0 second Memory limit: 64 MB Let’s consider K-based numbers, containing exactly N digits. We define a number to be valid if itsK-based notation doesn’t c

Never say never 659

ural 1012 K-based Numbers. Version 2

类型:递推+高精度 题目:同ural 1009 思路:同ural 1009 // ural 1012 K-based Numbers. Version 2 #include #include #include #include using namespace std; #define FOR(i,a,b) for(i = (a); i < (b); ++i) #define FOR

gold_bridge 373

ural 1013. K-based Numbers. Version 3

       在这道题的版本三改了之后难度确实提高了不少,但是这道题也确实很有代表性。第一个版本是直接算,第二个版本是高精度,这个版本是10^18的量级,不可能直接算,需要使用矩阵乘法并用矩阵快速幂降低计算次数至logN量级。    动归的状态转移和前两个版本一样就不提了,主要用到的是矩阵快速幂以及边算边取模保证不爆long long,至于为什么可以边算边取模,不清楚的朋友可以看下数论相关的内容。...

acelove40的博客 961

URAL1009——DP——K-based Numbers

Description Let’s considerK-based numbers, containing exactlyNdigits. We define a number to be valid if itsK-based notation doesn’t contain two successive zeros. For example: ...

dgjm4087的博客 155

URAL 1012. K-based Numbers. Version 2

和1009一样,只不过需要用大数~~!!#include #include #include #include #include #include #include #include using namespace std; const int MAX = 1010; int dp[20][200][MAX]; int len[20][200]; int main() { int n,k; memset(dp,0,sizeof(dp)); for

小媛在努力~ 1954
上一篇: POj 3420
下一篇: POJ 3145 Harmony Forever
__Galaxy
博客等级 码龄10年 8粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值