【CodeForces】CF1907E--Good Triples题解

 题目传送门(洛谷):Good Triples - 洛谷​​​​​​

大致题意

若三个整数a, b, c, 它们的和为n,各个数位之和等于n的各个数位之和,则该三元组合法。

给定n,求有几种不同的三元组(强调顺序,即(1, 2, 3)与(1, 3, 2)不同)

思路

首先理解题意。例如题中第一组样例数据:

n = 11时n的各个数位之和(以下简写为dig(n))为2

例如(0, 1, 10)的组合满足条件:0 + 1 + 10 = 11; dig(0) + dig(1) + dig(10) = dig(11) = 2

其实这一题不算很难,重要的是思维

我们要想清楚,如果这三个数相加时发生了进位,则该三元组一定不合法

n=9 ,原本三元组满足条件:

2+3+4 = 9, dig(2) + dig(3)+dig(4) = 9, too(?)

此时,我们更换一下:

dig(1+5+6) = 3 \neq dig(1)+dig(5)+dig(6)  

这是因为,在发生进位时,数字本身的总和不受影响,

但结果中各个数位之和却会减小(进到前一位去了)

所以,只要考虑相加不进位的三元组即可。

代码

非常简洁:

#include<iostream>
using namespace std;
#define MaxN 10000005
#define For(i, j, k) for(int i = j; i <= k; i++)
#define int long long
//别忘了开 long long !!!

int t, n;
int f[15];
//f[i]:三个个位数之和达到i的方案数

signed main()
{
    For(i, 0, 10){
        For(j, 0, 10){
            For(k, 0, 10){
                if(i+j+k < 10)  //没有进位
                    f[i+j+k]++; //计数器增加
            }
        }
    }
    cin >> t;
    while(t--){         //CF特色多测
        cin >> n;
        int ans = 1;
        while(n){
            int a = n % 10;
            ans *= f[a];        //每个数位有f[a]种情况
            n /= 10;
        }
        cout << ans << endl;
    }
    return 0;
}

总结

没什么难度,只要推出性质即可,符合CF一如既往的惯例。

今天就说那么多,最后,制作不易,如果你觉得这篇文章还不错的话,麻烦点个收藏点个关注,这是免费的,您随时可以取消。你们的支持是作者最大的动力!

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

起床气233

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

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

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

打赏作者

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

抵扣说明:

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

余额充值