?题目传送门(洛谷):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:
??
这是因为,在发生进位时,数字本身的总和不受影响,
但结果中各个数位之和却会减小(进到前一位去了)
所以,只要考虑相加不进位的三元组即可。
非常简洁:
#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一如既往的惯例。
今天就说那么多,最后,制作不易,如果你觉得这篇文章还不错的话,麻烦点个收藏点个关注,这是免费的,您随时可以取消。你们的支持是作者最大的动力!