由这次的D题从杜老师那学会的比较新奇的背包,我暂且将其命名为因子背包
题意:
一个数xxx被称为好数,当且仅当他被ddd整除而不被d2d^2d2整除。
给定一个数nnn,问是否有超过两种组成方式,让它成为一个或若干个好数的乘积。
TTT组询问,T<=100T<=100T<=100,n,d<=109n,d<=10^9n,d<=109

Solution 1
首先定然可以很暴力的将所有nnn的好数因子给找出来,我们需要的就是用这些数来构成nnn。
由于一个数可以用若干次,所以其实本质上这是一个完全背包问题,我们考虑正常的完全背包我们咋做的。
F[i][j]=F[i−1][j]+F[i−1][j/d[i]]F[i][j]=F[i-1][j]+F[i-1][j/d[i]]F[i][j]=F[i−1][j]+F[i−1][j/d[i]],第一维可以滚掉,也就是F[j]+=F[j/d[i]]F[j]+=F[j/d[i]]F[j]+=F[j/d[i]]
问题来了,由于值域太大,我们不可能遍历整个值域来做这个背包,但这时我们发现由于最后能对F[n]F[n]F[n]做出贡献的只有nnn的因子,而对nnn的因子做出贡献的则是nnn的因子的因子(也是nnn的因子),因此我们只需要从小到大遍历nnn的所有因子(最多也就130013001300个左右),这样最终贡献给F[n]F[n]F[n]的答案一定是正确的。

现在只剩下一个问题了,虽然我们只需要遍历nnn的所有因子,但是这些因子可能也很大,并不能直接开一个这么大的数组。
我会map!
额,多了个logloglog,这题好像有可能会T。
那咋办?
可以用一个“双指针”的方法,我们开两个数组id[1e5+5],gid[1e5+5]id[1e5+5],gid[1e5+5]id[1e5+5],gid[1e5+5]
对于每一个因子c[i]c[i]c[i],如果他小于等于1e51e51e5,那么我们就将id[c[i]]=iid[c[i]]=iid[c[i]]=i,否则gid[n/c[i]]=igid[n/c[i]]=igid[n/c[i]]=i,这样就可以把值域全部映射回因子个数里,用的时候也判断一下要用的数是通过ididid还是gidgidgid存放的即可。

Code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#define ll long long
#define lowbit(x) x&(-x)
#define mp make_pair
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
const int mod=998244353;
const int maxn=1e7+5;
const int maxm=1e5;
inline int read()
{int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+(c-'0');c=getchar();}return x*f;
}
int T;
int f[2050];
int id[100050],gid[100050];
int tot,c[2050];
signed main()
{T=read();while(T--){tot=0;int n=read(),d=read();for(int i=1;i*i<=n;i++){if(n%i==0) {if(n/i==i) c[++tot]=i;else c[++tot]=i,c[++tot]=n/i;}   }sort(c+1,c+tot+1);for(int i=1;i<=tot;i++){if(c[i]<=maxm) id[c[i]]=i;else gid[n/c[i]]=i;}f[1]=1;for(int i=1;i<=tot;i++){if((c[i]%d==0)&&((c[i]/d)%d!=0)){for(int j=1;j<=tot;j++){if((n/c[i])%c[j]==0){int x=c[i]*c[j];int y=(x<=maxm)?id[x]:gid[n/x];f[y]=min(f[y]+f[j],2);}}}}if(f[tot]>=2) cout<<"Yes"<<endl;else cout<<"No"<<endl;   for(int i=1;i<=tot;i++) f[i]=0;}}

[因子背包] CF1647D Madoka and the Best School in Russia相关推荐

  1. CF1647D Madoka and the Best School in Russia(数论,dp,离散化技巧)

    题目链接 题意 给定 1e9 以内的正整数 n,d,问 n 能否由至少两种不同的方式由漂亮数相乘得到: 漂亮数的定义为:能被 d 整除,但不能被 d * d 整除: 思路 n 有一系列数相乘得到,则每 ...

  2. 【CodeForces - 1647D】Madoka and the Best School in Russia(分类讨论,因数分解)

    题目链接 题意: 判断一个数nnn,能否有至少两种方法将其表示为 n=a1a2...akn=a_1a_2...a_kn=a1​a2​...ak​(k>=1k>=1k>=1),需要满足 ...

  3. Codeforces Round #777 (Div. 2)

    7月19日 A Madoka and Math Dad B Madoka and the Elegant Gift C Madoka and Childish Pranks A Madoka and ...

  4. Codeforces Round #777 (Div. 2) 简训

    Codeforces Round #777 (Div. 2) 简训 导语 涉及的知识点 题目 A Madoka and Math Dad B Madoka and the Elegant Gift C ...

  5. Codeforces Round #777 (Div. 2) (A-D题解)

    源代码:ACM/OpenjudgeNow/Codeforces at master · abmcar/ACM (github.com) 更好的阅读体验: 折跃坐标 碎碎念:不亏是俄罗斯场+二次元出题人 ...

  6. Codeforces Round #777 (Div. 2) 题解

    Codeforces #777 题解 这次带上了大佬前来验题xs 公开大佬珍贵的代码资源供参考 TOC A.Madoka and Math Dad B.Madoka and the Elegant G ...

  7. 【CF #777 div2】A—D

    A. Madoka and Math Dad 题解:拆分成2.1.找到能生成的最大值即可. #include<bits/stdc++.h> using namespace std; con ...

  8. [bzoj1025][SCOI2009]游戏 (分组背包)

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一 且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,--,N写一排在纸上.然后再在这一排下面写上它们 ...

  9. 2020CCPC(威海) - Clock Master(数论+分组背包)

    题目大意:给出一个数字 n ,要求分解成:a[ 0 ] + a[ 1 ] + ... +  a[ m ] = n,( m 没有约束 ),使得 lcm( a[ 0 ] , a[ 1 ] , ... a[ ...

最新文章

  1. 线程池的几个重要参数?—— 七大参数
  2. 比特大陆新任CEO疑似曝光背后
  3. java web html入门书籍,JavaWeb入门到学废的第一天(HTML学习)
  4. jquery.hotkeys监听键盘按下事件keydown
  5. oracle11gr2克隆安装,克隆安装Oracle 11G HOME
  6. 【翻译】PHP中 文字编码变换时 使用SJIS-win而非SJIS,使用eucJP-win而非EUC-JP
  7. Word文档标题“多级编号”设置(用于处理 文档二级标题不跟随一级标题序号编号,如 本应该为2.1 结果为1.1)
  8. 集合例题3.:现在有一个map集合如下:Map<Integer,String> map = new HashMap<Integer, String>();map.put(1, “张三丰“);map.
  9. coffeescript_在客户端上使用CoffeeScript
  10. Java day 31 网络编程和简单练习
  11. 在字节跳动“混”了2年软件测试岗,被辞之后我承认我后悔了...
  12. STM32C8T6的FreeRTOS移植
  13. Unity中退出的方法_艾孜尔江撰
  14. 路由器经常断网,网络不稳定怎么办, 教你如何让旧路由器也能运转飞起
  15. NoteBurner iTunes DRM Audio Converter for Mac(音频转换工具) V2.4.4破解版
  16. 3 分钟生成一个单元测试报告,这个样式爱了
  17. Web调用浏览器摄像头
  18. 自由度和剧情新颖的单机游戏
  19. 为什么 VR/AR 越聚焦越远
  20. java集合框架的接口_Java集合框架之Collection接口详解

热门文章

  1. MySQL必知必会二十三:使用存储过程
  2. wml 与服务器交互
  3. 这么多编程语言,初学者选择哪个比较好?
  4. 50个BA分析工具第四个-Business Case
  5. Python:通过turtle 画樱花树
  6. python与金融工程的区别_科研进阶 | 纽约大学 | 金融工程、量化金融、商业分析:Python金融工程分析...
  7. JAVA 接口签名sign生成 工具类
  8. java 制作签名版电子合同pdf版本
  9. 小说作者推荐:不问三九合集
  10. 图书预约管理系统的设计与实现