正解:搜索

解题报告:

先放下传送门QwQ

umm其实并不难,,,最近在复健基础姿势点所以都写的是些小水题QAQ

首先考虑如果能构造出来一定是因数凑起来鸭,所以先把因数都拆出来,然后就爆搜

几个常见的剪枝就不说了,想cue下最近碰到了好几次的一个

是这样儿的,就以这题为例,可以对所有因数排序,强制从小到大选这种我就不说了太套路了,有一个小check是可以计算出还要乘几个数嘛,这里设已经算出来了是x,然后就把已经乘出来了的数乘以当前最小的x个数,如果大于目标就可以break了

感觉最近碰到了好几次,,,?就栅栏那题,也用到了来着

然后这题有个小坑点,,,我被卡了半个小时TT

好趴其实不是坑是我傻逼,,,就乘法记得开ll,,,只要是乘法都顺手开个就是了TT

没了QAQ

bzoj3733 [Pa2013]Iloczyn 搜索bzoj3733 [Pa2013]Iloczyn 搜索
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ll i=x;i<=y;++i)
#define my(i,x,y) for(ll i=x;i>=y;--i)
    
const int N=50000+10;
int n,K,invv[N],inv_cnt;
     
il int read()
{
    rc ch=gc;ri x=0;rb y=1;
    while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
    if(ch=='-')ch=gc,y=0;
    while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
    return y?x:-x;
}
il bool dfs(ri nw,ri num,ri sum)
{
    if(num==K && sum==n)return true;
    if(num>=K)return false;
    if(nw>inv_cnt)return false;
    if(inv_cnt-nw+1<K-num)return false;
    ri tmp=sum;
    rp(i,nw,nw+K-num-1)if(1ll*tmp*invv[i]>n)return false;else tmp=1ll*tmp*invv[i];
    if(dfs(nw+1,num,sum))return true;if(dfs(nw+1,num+1,sum*invv[nw]))return true;return false;
}
il void jud(ri x)
{
    inv_cnt=0;for(ri i=1;i*i<=x;++i){if(!(x%i)){invv[++inv_cnt]=i;if(i*i!=x)invv[++inv_cnt]=x/i;}}sort(invv+1,invv+1+inv_cnt);
    if(dfs(1,0,1))return void(printf("TAK\n"));printf("NIE\n");
}
    
int main()
{
//  freopen("bzoj3373.in","r",stdin);freopen("bzoj3373.out","w",stdout);
    int T=read();
    while(T--){n=read(),K=read();jud(n);}
    return 0; 
}
放下代码嗷

相关文章:

  • 2021-07-15
  • 2021-09-30
  • 2021-08-17
  • 2021-10-12
  • 2022-01-27
  • 2021-09-28
  • 2021-08-05
猜你喜欢
  • 2022-01-10
  • 2021-07-05
  • 2021-12-21
  • 2021-06-20
  • 2021-06-13
  • 2021-07-01
  • 2022-12-23
相关资源
相似解决方案