2 条题解

  • 1
    @ 2025-7-11 10:21:23
    #include<bits/stdc++.h>
    using namespace std;
    long long n,s;
    int dx[15]={6,2,5,5,4,5,6,3,7,6};
    int f(int x){
    if(x<10) return dx[x];
    int sum=0,c=x;
    while(c>0){
    sum+=dx[c%10];
    c/=10;
    }
    return sum;
    }
    int main(){
    cin>>n;
    n-=4;
    for(int i=0;i<=1111;i++){
    for(int j=0;j<=1111;j++){
    int k=i+j;
    if(f(i)+f(j)+f(k)==n) s++;
    }
    }
    cout<<s;
    return 0;
    }
    
    • 0
      @ 2026-1-25 9:38:18

      欢迎来到小马课堂

      怎么还来啦,烦死了

      问题分析:火柴棍拼等式问题

      1. 问题描述

      给定 nn 根火柴棍,拼出形如 A+B=C 的等式,其中:

      • ABCA、B、C 是用火柴棍拼成的整数(非零时不能有前导零)
      • 加号+和等号=各需要 22 根火柴棍
      • 如果 ABA≠B,则 A+B=CB+A=C 视为不同等式
      • 所有火柴棍必须用完。

      2. 关键约束条件

      • 运算符固定消耗 44 根火柴棍(加号 22 根,等号 22 根)
      • 数字拼法固定(090-9 各需要特定数量的火柴棍)
      • n24n \le 24,因此数字部分最多使用20根火柴棍

      3. 解题思路分析

      1. 数字表示分析​:
        • 需要预先存储每个数字 090-9 的火柴棍消耗量
        • 多位数消耗量是其各位数字消耗量之和。
      2. 等式结构分析​:
        • 等式形式固定为 A+B=C
        • 需要满足两个条件:
          • 算术条件:A + B = C
          • 火柴棍条件:消耗总量 =n=n
      3. 搜索空间分析​:
        • 由于 n24n \le 24,数字部分最多消耗 2020
        • 可以估算 ABCA、B、C 的可能取值范围:
          • 单个数字最大消耗 77数字 88
          • 三位数最大消耗约 2121888888
          • 实际有效范围更小。

      4. 算法优化思路

      1. 预处理优化​:
        • 预先计算所有可能数字的火柴棍消耗量
        • 使用动态规划或查表法避免重复计算
      2. 搜索策略优化​:
        • 合理限制 AABB 的枚举范围
        • 利用算术关系减少搜索空间 C=A+B(C=A+B)
        • 可以进一步优化为单层循环枚举 AA,然后计算 BB 的范围。
      3. 边界条件处理​:
        • 前导零问题
        • 00 的特殊处理
        • ABA≠B 时的排列组合。

      5. 复杂度分析

      • 预处理阶段:O(M)O(M)MM 为最大数字
      • 搜索阶段:O(K2)O(K^2)KK 为有效数字范围
      • 总体复杂度可控,因为 n24n \le 24 限制了数字范围。

      6. 测试案例分析

      • 输入 1414
        • 有效等式:0+1=11+0=1
        • 验证:6+2+2=10,加上运算符 44 根共 1414 根。
      • 输入 1818
        • 99 个有效组合
        • 0+11=116+(2+2)+(2+2)=12,加运算符 44 根共 1616需验证

      cppcpp 代码胡乱显示: 不可能让你这么轻松

      #include<bits/stdc++.h>
      #define re register
      #define il inline
      //#pragma GCC optimize(2)
      //#pragma GCC optimize(3,"Ofast","inline")
      typedef long long ll;
      using namespace std;
      const ll N=1e5+10;
      const ll mod=1e9+7;
      const ll maxn=INT_MIN;
      const ll minn=INT_MAX;
      const ll INF=0x3f3f3f3f3f;
      const ll E=1e-6;
      ll m[10]={6,2,5,5,4,5,6,3,7,6};
      ll n,ans=0;
      il ll read() {//适用于整数,写x=read();
      	ll x = 0,f = 1;
      	char ch = getchar();
      	while(ch < '0' || ch > '9') {
      		if(ch == '-')
      			f = -1;
      		ch = getchar();
      	}
      	while(ch >= '0' && ch <= '9'){
      		x = (x << 3) + (x << 1);
      		x += ch - 48;
      		ch = getchar();
      	}
      	return x * f;
      }
      il void write(ll x) {
      	if(x<0)	putchar('-'),x=-x;
      	if(x>9)	write(x/10);
      	putchar(x%10+'0');
      }
      ll cnt(ll n) {
      	if(n==0)
      		return m[0];
      	ll s=0;
      	while(n)
      		s+=m[n%10],n/=10;
      	return s;
      }
      signed main() {
      	ios::sync_with_stdio(0);
      	cin.tie(0),cout.tie(0);
      	n=read();
      	for(int a=0;a<=1000;++a) {
      		for(int b=0;b<=1000;++b) {
      			ll c=a+b;
      			if(cnt(a)+cnt(b)+cnt(c)==n-4) {
      				ans++;
      			}
      		}
      	}
      	write(ans);
      	return 0;
      }
      

      完了,电脑没电了,不给看了。

      拜拜。

      • 1

      信息

      ID
      60
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      (无)
      递交数
      267
      已通过
      96
      上传者