Description

给定正整数n和k,问能否将n分解为k个不同正整数的乘积

Input

第一行一个数T(T<=4000)表示测试组数
接下来T行每行两个数n(n<=10^9),k(k<=20)

Output

输出T行,若可以被分解,输出"TAK"否则输出"NIE"

Sample Input

3
15 2
24 4
24 5

Sample Output

TAK
TAK
NIE
 
好久不写搜索果然没什么剪枝的思路,其实这道题的剪枝也很好想
关键是效果非常显著
我们设$DFS(x,y,z)$表示到选到第$x$个因数还有$y$个没选乘积为$z$是否合法
然后我们预处理出来$f[i][j]$表示从$i$开始再选最小的$j$个的最小乘积
如果当前$z*f[x][y]>n$就一定没有合法方案了,加上这个剪枝后跑的飞快
代码:
 #include<iostream>
#include<cstdio>
#include<algorithm>
#define M 2010
using namespace std;
int T,n,k,tot;
int q[M],f[M][];
bool dfs(int x,int y,int z)
{
if(!y) return n==z;--y;
while(x+y<=tot)
{
if(f[x][y]<) return false;
if(1ll*f[x][y]*z>n) return false;
if(dfs(x+,y,z*q[x])) return true;
x++;
}
return false;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);tot=;
for(int i=; i*i<=n; i++)
if(n%i==)
{
q[++tot]=i;
if(n/i!=i) q[++tot]=n/i;
}
sort(q+,q++tot);
for(int i=; i<=tot; i++)
{
long long t=;
for(int j=; j<k&&(i+j)<=tot; f[i][j++]=t)
if(t>) {t*=q[i+j];if(t>n) t=-;}
}
if(dfs(,k,)) puts("TAK");
else puts("NIE");
}
return ;
}

[BZOJ3733]Iloczyn的更多相关文章

  1. [bzoj3733]Iloczyn 题解(搜索剪枝)

    3733: [Pa2013]Iloczyn Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 741  Solved: 217[Submit][Statu ...

  2. 【BZOJ3733】[Pa2013]Iloczyn (搜索)

    [BZOJ3733][Pa2013]Iloczyn (搜索) 题面 BZOJ 题解 把约数筛出来之后,直接爆搜,再随便剪枝就过了. 最近一句话题解倾向比较严重 #include<iostream ...

  3. BZOJ3733 : [Pa2013]Iloczyn

    首先将$n$的约数从小到大排序,设$dfs(x,y,z)$表示当前可以选第$x$个到第$m$个约数,还要选$y$个,之前选的乘积为$z$是否可能. 爆搜的时候,如果从$x$开始最小的$y$个相乘也超过 ...

  4. bzoj3733 [Pa2013]Iloczyn 搜索

    正解:搜索 解题报告: 先放下传送门QwQ umm其实并不难,,,最近在复建基础姿势点所以都写的是些小水题QAQ 首先考虑如果能构造出来一定是因数凑起来鸭,所以先把因数都拆出来,然后就爆搜 几个常见的 ...

  5. 【PA2013】【BZOJ3733】Iloczyn

    Description 给定正整数n和k,问是否能将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示測试组数 接下来T行每行两个数n(n<=10^9),k(k ...

  6. BZOJ3713: [PA2014]Iloczyn

    3713: [PA2014]Iloczyn Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 206  Solved: 112[Submit][Status ...

  7. BZOJ 3713: [PA2014]Iloczyn( 枚举 )

    斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- ...

  8. 3713: [PA2014]Iloczyn

    3713: [PA2014]Iloczyn Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 327  Solved: 181[Submit][Status ...

  9. [PA2014]Iloczyn

    [PA2014]Iloczyn 题目大意: 询问\(n(n\le10^9)\)是否是两个斐波那契数之积. 思路: \({\rm fib}(45)<10^9,{\rm fib}(46)>10 ...

随机推荐

  1. ubuntu下安装myeclipse+破解

    1.给myeclipseInstaller.run权限 chmod myeclipseInstaller.run 2.安装(结束时不启动,去掉√) ./myeclipseInstaller.run 3 ...

  2. 关于Springboot 中注入多个cacheManage 时候 存在报错

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'e ...

  3. ipconfig /flushdns

    C:\Users\sas>ipconfig /flushdns Windows IP 配置 已成功刷新 DNS 解析缓存. C:\Users\sas>ipconfig --help 错误: ...

  4. 转:C语言的编译链接过程的介绍

    11:42:30 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接 ...

  5. javascrpt 页面格式化页面

    下面这个页面,格式化javaScript <html> <head> <title>JS格式化工具 </title> <meta http-equ ...

  6. php用类生成二维码

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/28630289 百度云盘里面已经有了.引用 ...

  7. NAND flash学习所获----(Zac)

    Nand Falsh外围电路:peripheral circuit 1.Nand flash里至少有2个state Machine(controller),即2个主控. 一个主控:负责处理前端事情. ...

  8. 最长上升子序列算法(n^2 及 nlogn) (LIS) POJ2533Longest Ordered Subsequence

    问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列 ...

  9. 定时任务之elastic-job概述

    定时任务有哪些? Timer定时器 ScheduledExecutorService Spring自带的@Scheduled Quartz定时任务 当当elastic job定时任务 Quartz实现 ...

  10. java的接口为什么不能实例化

    java的接口为什么不能实例化呢?首先,我们需要明白实例化的含义.实例化实际意义是在jvm的堆中开辟出一块内存空间,比如Student s = new Student();此处声明Student对象s ...