CF1907F 高中数学

发布时间 2023-12-07 08:55:27作者: lu1no

https://codeforces.com/contest/1907/problem/E

有一种情况是一定合法的,就是将x分成0,0,x。我们发现如果将x分出去,导致x退位了,一定会是变化位数和的,比如将26的个位分出去7,变成19, 7,那位数和就是17。
所以,这题的关键点是我们对于一个数应该是每个位的数互不干涉的来分,个位分给个位,十位分给十位,尊卑有序,才能保证位数和不变。这告诉我们要按位处理。
另一个关键点就是,我们如何抽象出数学的模型。对于一个位上的数,我们可以将他分给三个数,每个数可以得到0。
这是一个非常经典的排列组合问题,忘了可以回顾一下。
https://www.bilibili.com/video/BV16U4y177gM?p=6&vd_source=6904308b9d72d1e34db12006b84054e6 P6隔板法

这种问题的子模型是n个物品分给m个人,每个人至少一个,这个时候用隔板法,用m-1个板子分出m个人的份,且板子不能再头尾(保证每人都分到一个以上),所以有n-1个空格,n-1个空格放m-1个板,有 \(C_{n-1}^{m-1}\)种方法。
变形类似于n个物品分给m个人,每个人至少个,参照上面的问题,我们可以先提前给每个人都塞一个物品,那么就有n-m个物品分给m个人,每人至少一个,有 \(C_{n-1-m}^{m-1}\)种方法。
如果说我们有n个物品分给m个人,可以分个,那么可以先让每个人交出一个,那就是n+m个物品分给m个人,每人至少一个,有 \(C_{n+m-1}^{m-1}\)种方法。

回到问题,这题就是第三种情况,将n个物品分给三人,每人可以为0, \(C_{n+3-1}^{3-1}\)种方法,即 \(C_{n+2}^{2}\)。然后每个位都是独立的,每个位的方案数乘起来就是答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int mod = 998244353, INF = 1 << 30;
const int N = 2e5 + 10;

void solve()
{
    int x;
    cin >> x;
    LL ans = 1;
    while (x){
        int n = x % 10;
        ans *= (n + 2) * (n + 1) / 2;
        x /= 10;
    }
    cout << ans << endl;
}


int main()
{
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while(t --) solve();
    return 0;
}