【CodeForces】CF1907E--Good Triples题解

发布时间:2024年01月07日

?题目传送门(洛谷):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

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

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

若原本三元组满足条件:

1 + 2 + 3 = 6

此时,我们把第三个数3改成9:

1 + 2 + 9 = 12 \neq 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一如既往的惯例。

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

文章来源:https://blog.csdn.net/weixin_52398991/article/details/135315367
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。