HDU 4228 Flooring Tiles 反素数的应用

给你一个数N,找出一个最小的可以拆分成N种乘积表达形式的数x

比如N=2,6可以拆成2x3或者1x6两种,但不是最小的,最小的是4可以拆成1x4,2x2两种

首先可以肯定的是x必然有N*2或者是N*2-1(完全平方的情况)个约数

利用求反素数的过程求出约数为N*2和N*2-1个的最小的数

#include <cstdio>
#include <sstream>
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <cctype>
#include <ctime>
#include <set>
#include <climits>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <cmath>
#include <string>
#include <list>

#define INPUT_FILE "in.txt"
#define OUTPUT_FILE "out.txt"

using namespace std;

typedef unsigned long long LL;
const int INF = INT_MAX / 2;
const LL maxval = 1e18 + 1;
const int maxn = 75 + 5;
const int maxcnt = 160;
LL cnt[maxn * 2];
int prime[20] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
int times[20];

void dfs(LL curnum,LL curcnt,int nowt) {
    if(curnum > maxval) return;
    if(curcnt <= maxcnt) {
        cnt[curcnt] = min(cnt[curcnt],curnum);
    }
    for(int i = 1;i <= maxcnt;i++) {
        if(nowt == 0 || i <= times[nowt - 1]) {
            curnum *= prime[nowt];
            if(curnum > maxval) break;
            curcnt = curcnt / i * (i + 1);
            times[nowt] = i;
            dfs(curnum,curcnt,nowt + 1);
        }
        else break;
    }
}

int main() {
    for(int i = 1;i <= maxcnt;i++) cnt[i] = maxval;
    dfs(1,1,0);
    int N;
    while(cin >> N,N) {
        LL a1 = cnt[N * 2 - 1],a2 = cnt[N * 2],sa = sqrt(a1);
        if(sa * sa == a1 && a1 < a2) cout << a1 << endl;
        else cout << a2 << endl;
    }
    return 0;
}

HDU 4228 Flooring Tiles 反素数的应用

时间: 2024-10-10 22:36:56

HDU 4228 Flooring Tiles 反素数的应用的相关文章

HDU 4228 Flooring Tiles 反素数

推出了结论,万万没想到最后用搜索.. 还想dp来着.. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set> #include <vector> #include <map> using namespace std; #define ll lon

ZOJ 2562 HDU 4228 反素数

反素数: 对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4. 如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数. ZOJ 2562 反素数 因为写了POJ 2886的线段树,然后里面有反素数,以前没遇到过,所以先搞这两题普及一下知识再说. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&

HDUSTOJ-1558 Flooring Tiles(反素数)

1558: Flooring Tiles 时间限制: 3 Sec  内存限制: 128 MB提交: 59  解决: 36[提交][状态][讨论版] 题目描述 You want to decorate your floor with square tiles. You like rectangles. With six square flooring tiles, you can form exactly two unique rectangles that use all of the tile

HDU 2521 反素数

反素数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4238    Accepted Submission(s): 2456 Problem Description 反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使

hdu 2521 反素数(打表)

反素数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5723    Accepted Submission(s): 3355 Problem Description 反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使

HDOJ(HDU) 2521 反素数(因子个数~)

Problem Description 反素数就是满足对于任意i(0< i < x),都有g(i) < g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大. Input 第一行输入n,接下来n行测试数据 输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b]. Output 输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数. Sample Input 3 2 3

HDU 4133 StrangeStandard 反素数

题目链接:点击打开链接 反素数:点击打开链接 爆搜幂即可. #include <iostream> #include <cstdio> #include <string.h> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <set> #include <stack> #include

hdu 4542 &quot;小明系列故事——未知剩余系&quot; (反素数+DFS剪枝)

传送门 参考资料: [1]:https://blog.csdn.net/acdreamers/article/details/25049767 题意: 输入两个数 type , k: ①type = 0,求[1,262]中的因子个数为 k 的反素数,如果求解的答案 > 262,输出"INF": ②type = 1,求使得 num-factor[num] = k 的最小的num: 题解: 只有当 type = 1 时,才有可能输出 "Illegal": 那,什么

反素数 -- 数学

反素数就是区间内约数个数最多的那个数. 在ACM题目里, 一般是求约数最多而且数字最小的那个数,[1--n] 二是求约数刚好等于n的最小的那个数 三是求区间里的最小反素数[beign,end] 1和3有区别吗?有,1可以加速,3只能暴力 先说下思路 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. (2)我们可以知道,计算约数的个数和质因数分解有着很大的联系: 若Q的质因数分解为:Q=p1^k1*p2^k2*…*pm^km(p1…pm为素数,k1…km≥1),则Q有(k1+1