首页 > 其他分享 >E. Good Triples

E. Good Triples

时间:2023-12-07 18:56:27浏览次数:36  
标签:10 good Triples triples number Good digsum integer

E. Good Triples

Given a non-negative integer number $n$ ($n \ge 0$). Let's say a triple of non-negative integers $(a, b, c)$ is good if $a + b + c = n$, and $digsum(a) + digsum(b) + digsum(c) = digsum(n)$, where $digsum(x)$ is the sum of digits of number $x$.

For example, if $n = 26$, then the pair $(4, 12, 10)$ is good, because $4 + 12 + 10 = 26$, and $(4) + (1 + 2) + (1 + 0) = (2 + 6)$.

Your task is to find the number of good triples for the given number $n$. The order of the numbers in a triple matters. For example, the triples $(4, 12, 10)$ and $(10, 12, 4)$ are two different triples.

Input

The first line of input contains a single integer $t$ ($1 \le t \le 10^4$) — the number of test cases. Descriptions of test cases follow.

The first and only line of the test case contains one integer $n$ ($0 \le n \le 10^7$).

Output

For each test case output one integer, the number of good triples for the given integer $n$. Order of integers in a triple matters.

Example

input

12
11
0
1
2
3
4
5
3141
999
2718
9999999
10000000

output

9
1
3
6
10
15
21
1350
166375
29160
1522435234375
3

Note

In the first example, the good triples are $(0, 0, 11)$, $(0, 1, 10)$, $(0, 10, 1)$, $(0, 11, 0)$, $(1, 0, 10)$, $(1, 10, 0)$, $(10, 0, 1)$, $(10, 1, 0)$, $(11, 0, 0)$.

In the second example, there is only one good triple $(0, 0, 0)$.

 

解题思路

  比 G 题难,G 都做出来了这题还不会。

  如果没观察出 $a+b+c$ 有进位则必然有 $digsum(a) + digsum(b) + digsum(c) > digsum(n)$ 那就真别想做出来了。假设 $x$ 在十进制下有 $n$ 个数位,表示成 $x_{n-1}x_{n-2} \ldots x_{0}$,同理将 $a$,$b$,$c$ 用 $n$ 个数位来表示,不足用前导零补。如果每一个数位都不产生进位,即对于 $i \in [0,n-1]$,都有 $a_i + b_i + c_i < 10$,那么 $digsum(a) + digsum(b) + digsum(c) = digsum(n)$ 就等价于对于每个 $i \in [0, n-1]$ 都有 $a_i + b_i + c_i = x_i$。否则如果某一位产生了进位,那么 $digsum(a_i) + digsum(b_i) + digsum(c_i) = a_i + b_i + c_i >  digsum(x_i)$,两位数肯定大于一位数,因此必然有 $digsum(a) + digsum(b) + digsum(c) > digsum(n)$。

  为此我们只需单独考虑 $a$,$b$,$c$ 的每一位选哪些数即可,即求 $a_i + b_i + c_i = x_i$ 的非负整数解的数量。可以用隔板法,不过隔板法求的是正整数解的数量,只需让 $a_i$,$b_i$,$c_i$ 都加一个偏移量即可,即 $a'_i = a_i + 1$,$b'_i = b_i + 1$,$c'_i = c_i + 1$,那么等式就变成 $a'_i + b'_i + c'_i = x_i + 3$,因此解的数量就是 $C_{x_i + 2}^{2}$。因此最终答案就是 $\prod\limits_{i=0}^{n-1}{C_{x_i + 2}^{2}}$。

  AC 代码如下,时间复杂度为 $O(\log{n})$:

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

void solve() {
    int x;
    scanf("%d", &x);
    LL ret = 1;
    while (x) {
        int t = x % 10;
        x /= 10;
        ret *= (t + 2ll) * (t + 1) >> 1;
    }
    printf("%lld\n", ret);
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        solve();
    }
    
    return 0;
}

 

参考资料

  Codeforces Round 913 (Div. 3) Editorial:https://codeforces.com/blog/entry/123012

标签:10,good,Triples,triples,number,Good,digsum,integer
From: https://www.cnblogs.com/onlyblues/p/17883699.html

相关文章

  • [good]vscode编译多个c源文件
    windows上实现vscode编译多个c源文件-知乎(zhihu.com)1、建立bin/doc/inc/app/src等目录2、bin目录用来存放生成的exe文件,doc用来存放帮助文档,inc用来存放*.h文件,app用来存放主程序main.c,src用来存放*.c文件3、修改lauch.json文件{//UseIntelliSensetolearnabo......
  • Misc_XCTF_WriteUp | a_good_idea
    题目分析压缩包开出只汤姆:一番检查后在十六进制文件末尾发现zip压缩包文件头:更改文件后缀名为zip,在压缩包里开出两只汤姆和一个文本文件。txt内容:“trytofindthesecretofpixels”,直译为:“试着找出像素的秘密”。根据这条提示我们打开StegSolve分别查看两张......
  • C1. Good Subarrays (Easy Version)
    思路:我们枚举每一个左端点,对于每一个左端点,寻找最长的满足条件的区间,这个区间长度就是左端点对答案的贡献,可以发现具有单调性,右端点只会前进不会倒退。所以我们两个指针各扫一遍区间就可以。#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,......
  • C1. Good Subarrays (Easy Version)(推公式找性质)
    思路:\[能想到平方是比较特殊的,因为x*x一定是x的倍数也就是说\sqrt[2]{x*x}={x}\]\[所以需要考虑平法之间的数手模一下样例可以发现[x^2,(x+1)^2)之间是x倍数的有x^2\]\[x*(x+1),x*(x+2)这三个,所以可以知道平方之间有三个,只要讨论一下出来整个区间边界还有多少个\]这里可......
  • [good]串口读取
    #include<stdio.h>#include<stdlib.h>#include<math.h>#include<limits.h>#include<string.h>#include<windows.h>#include"serialport.h"intmain(){//wordbyteWORD_BYTEwb;wb.word=0x12......
  • [good]c语言中各种类型
    #include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdarg.h>#include<assert.h>#include<math.h>#include<time.h>#include<limits.h>#include<float.h>#include<ctype.h>#i......
  • [good]enum
    typedefenum{Reg_Set_Speed=100,//100Reg_Set_Enable_VSP,//101Reg_Set_Dir,//102Reg_Force_Stop}Modbus_Holding_Registors;这是一个C语言中的`enum`(枚举)类型定义。枚举是一种用户定义的数据类型,它可以包含几个用户定义的值。在这个例子中,`M......
  • [good]数据类型
    `uint`是一种无符号整数类型,它的全称是"unsignedint"。这种类型可以表示从0到某个正数的值。具体能表示的最大值取决于实现,但在大多数现代系统上,`uint`通常是32位的,可以表示的最大值是4294967295。与此相比,`uint8_t`和`uint32_t`是固定宽度的整数类型,它们的位宽分别是8位和32位......
  • [good]c语言数组的运算
    #include<stdio.h>#include<stdlib.h>#include<time.h>#defineMAX10int**createRandom2DArray(introws,intcols){srand(time(NULL));//初始化随机数生成器int**arr=(int**)(malloc(sizeof(int*)*rows));if(arr==NULL)......
  • [ABC327G] Many Good Tuple Problems
    题目链接简化题意:有一个\(n\)个点的图,问有多少个长度为\(M\)的边序列,满足连边后图是二分图。\(n\le30,m\le10^9\)考虑先强制要求无重边。定义\(f_{i,j}\)为\(i\)个点,\(j\)条边的图的二分图染色数量(染色方式不同算多次)。这个是可以通过枚举黑色点的数量算出来。然......