大赞的数论题;

大致思路:

对于TYPE=1的情况,认为    X 中有  X-K个约数,求最小的X,X-K>0 那么化为B+K的约数为B,

我们知道(B+K)的约数<=2*SQRT(B+K);这个应该知道,

再化简一下:B*B<=4(B+K),可以直接枚举B,有人担心会TLE,我们再证明一下:

化简得 :B*B-4*B+4<=4*K+4;然后K<=47777,所以可以枚举了。。

对于TYPE=0的情况, 我们可以预先求出有X个数的最小数,因为根据求约数个数的方程N=a[1]^x1+a[2]^x2.....;

num=(1+x1)*(1+x2)*。。。。;

这里我们可以DFS搜索出来。具体看看代码应该能明白

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
typedef long long ll;
using namespace std;
#define maxn 200000
const long long inf=(1ll<<62)+1;
int prime[maxn];
ll a[maxn*10];
int b[maxn*2],t; void pri()
{
for (int i=2;i*i<maxn;i++)
if (!b[i])
for (int j=i*2;j<maxn;j+=i)
b[j]=1;
for (int i=2;i<maxn;i++)
if (!b[i]) prime[++t]=i;
} int get(ll x){
int ans=1;
ll tmp=x;
for (int i=1;prime[i]<=tmp/prime[i];i++)
{
ll t=1;
while (tmp%prime[i]==0)
{
t++;
tmp/=prime[i];
}
if (t>1) ans*=t;
}
if (tmp!=1) ans*=2;
return ans;
} void dfs(int i,ll x,int n)//DFS部分
{
if (n>47777) return;
if (x<inf&&(a[n]==0||a[n]>x)) a[n]=x;//类似DP的思想
for (int j=1;j<=62;j++)
{
if (inf/prime[i]<x) break;//防止溢出,
x*=prime[i];
if (x>=inf) break;
dfs(i+1,x,n*(j+1));
}
} void solve1(int x)
{
if (a[x]!=0) printf("%I64d\n",a[x]);
else printf("INF\n");
}
void solve(ll x)
{
ll num=1;
while (num*num<=(num+x)*4)
{
if (num==get(num+x)) {printf("%I64d\n",num+x);return; }
num++;
}
printf("Illegal\n");
} int main()
{
int T;
scanf("%d",&T);
pri();
dfs(1,1,1);
for (int o=1;o<=T;o++)
{
printf("Case %d: ",o);
int type,k;
scanf("%d%d",&type,&k);
if (type) solve(k);
else solve1(k);
}
return 0;
}

  

HDU4542 小明系列故事——未知剩余系的更多相关文章

  1. hdu 4542 小明系列故事——未知剩余系

    小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...

  2. hdu 4542 小明系列故事——未知剩余系 反素数 + 打表

    小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Prob ...

  3. hdu 4542 "小明系列故事——未知剩余系" (反素数+DFS剪枝)

    传送门 参考资料: [1]:https://blog.csdn.net/acdreamers/article/details/25049767 题意: 输入两个数 type , k: ①type = ...

  4. HDU 4542 小明系列故事——未知剩余系 (数论|反素数)

    分析 kuangbin的blog已经讲的很好了,我做一点补充 1.当做x*y>z的比较时,如果x \(\ast\) y过大,可以写成x>z/y 2.分解质因数时选择用f[][0]保存质数, ...

  5. HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  6. HDUOJ-----4506小明系列故事——师兄帮帮忙

    小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  7. HDUOJ----4501小明系列故事——买年货(三维背包)

    小明系列故事——买年货 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  8. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. HDU 4528 BFS 小明系列故事——捉迷藏

    原题直通车:HDU 4528 小明系列故事——捉迷藏 分析: 标记时加两种状态就行. 代码: #include<iostream> #include<cstring> #inc ...

随机推荐

  1. 一月份实现Adb小程序

    As Brian said: According to a post on xda-developers, you can enable ADB over WiFi from the device w ...

  2. How to get the underlying SSRS Report Query, reset query , add your own ranges and execute report [AX2012]

    Below is the small code snippet to get the underlying query of the SSRS report, reset query, prompt ...

  3. 对于java反射的理解

    java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装配,无序在组件之间进行链接. 反射允许在编写与执行时,使程序代码能够接入装载到JVM的类的内部信息,而不是源代码中选定的类 ...

  4. python实现 _ 图书馆书籍到期之前_自动邮件提醒

    一共两个脚本: 第一个是[借书完毕以及借书信息有变更(续借等)]的时候需要执行的脚本:实现模拟登陆,同时最新的借书信息的下载到本地文本:之所以没有这样做,是因为如果每次爬取一遍的话,需要每次输入一遍验 ...

  5. VC下的人人对弈五子棋(dos)

    #include"stdio.h"#include"stdlib.h"#include"string.h"#include "io ...

  6. oracle 11g 表空间使用率

    Oracle数据库表空间使用量查询: select b.file_name 物理文件名,b.tablespace_name 表空间,b.bytes/1024/1024 大小M,(b.bytes-sum ...

  7. hdu 5101 Select

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5101 Select Description One day, Dudu, the most cleve ...

  8. c++基础(一):数据类型和结构

    1.map map<int, int> rankDict;//定义map rankDict[1] = 5; rankDict[2] = 6;//map赋值 int dictSize = r ...

  9. python中的小技巧

    1.求1~100以内的素数 prime=filter(lambda x: not [x%i for i in range(2,x) if x%i==0], range(2,101))#列表推导,一行搞 ...

  10. 依网友要求发个修改award bios的方法(刷CPU微码)

    注意本文修改的是award BIOS 首先看自己的CPUID是哪个代码,打开CPU-Z如下图红圈中就是,此CPUID就是067A,好了下面就可以开始准备工作 准备好BIOS文件,以及CPU微码文件.可 ...