• 凑平方数


    把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。 比如:0, 36, 5948721

    再比如:

    1098524736
    1, 25, 6390784
    0, 4, 289, 15376
    

    等等...

    注意,0可以作为独立的数字,但不能作为多位数字的开始。 分组时,必须用完所有的数字,不能重复,不能遗漏。

    如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?

    注意:需要提交的是一个整数,不要填写多余内容。

    答案:

    先找出所有的范围内无重复数字的平方数,并记录位数,然后dfs。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    ll s[1000];
    int nu[1000];
    int ans,c;
    bool vi[10];
    void in(ll k,bool va) {
        do {
            vi[k % 10] = va;
            k /= 10;
        }
        while(k);
    }
    bool check(ll k) {
        bool vis[10] = {false};
        while(k) {
            if(vis[k % 10]) return false;
            vis[k % 10] = true;
            k /= 10;
        }
        return true;
    }
    bool check1(ll k) {
        do {
            if(vi[k % 10]) return false;
            k /= 10;
        }
        while(k);
        return true;
    }
    void dfs(int num,int k) {
        if(!num) {
            ans ++;
            return;
        }
        for(int i = k;i < c;i ++) {
            if(nu[i] > num) return;
            if(check1(s[i])) {
                in(s[i],true);
                dfs(num - nu[i],i + 1);
                in(s[i],false);
            }
        }
    }
    int main() {
        nu[c ++] = 1;
        for(ll i = 1;i * i <= 9876543210;i ++) {
            if(check(i * i)) {
                nu[c] = log10(i * i) + 1;
                s[c ++] = i * i;
            }
        }
        dfs(10,0);
        cout<<ans;
    }
  • 相关阅读:
    小技巧-WEB API第一次加载很慢
    20165313 《Java程序设计》第一周学习总结
    spring-boot源码分析之BeanFactory · 叁
    spring-boot源码分析之BeanFactory · 贰
    aaa
    JavaScript FSO属性大全
    IE浏览器下用JS创建文件
    FileSystemObject详解
    HTTP状态码
    Spring中异步执行方法(@Async)
  • 原文地址:https://www.cnblogs.com/8023spz/p/10545780.html
Copyright © 2020-2023  润新知