这么sb的题考场居然写挂了2233。

假设n=∏iaiki" role="presentation" style="position: relative;">n=∏iakiin=∏iaiki

那么集合中合法的数一定满足:

t=∏i(1/aiki)" role="presentation" style="position: relative;">t=∏i(1/akii)t=∏i(1/aiki)

发现后面的i很小,可以状压dp一发。

然后就没了。

注意集合中有1时需要把答案乘二。

代码:

#include<bits/stdc++.h>
#define N 100005
#define first xx
#define second yy
#define ll long long
using namespace std;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int a[505],m,tot=0,divv[N],cal[N],siz=0,dp[1<<20],sta[N];
ll n;
map<int,bool>in;
inline bool check(int x){
    if(n%x)return false;
    int t=sqrt(x),tmp=x;
    bool f=true;
    for(int i=2;i<=t;++i){
        if(tmp==1)break;
        if(tmp%i)continue;
        while(tmp%i==0)tmp/=i;
        if(!in[i])in[i]=true,divv[++siz]=i;
        if(n/x%i==0)f=false;
    }
    if(tmp!=1&&!in[tmp])in[tmp]=true,divv[++siz]=tmp;
    if(!f)return false;
    if(tmp==1)return true;
    if(n/x%tmp==0)return false;
    return true;
}
int main(){
    n=read(),m=read(),dp[0]=1;
    for(int i=1;i<=m;++i){
        int x=read();
        if(x==1){dp[0]=2;continue;}
        if(check(x))a[++tot]=x;
    }
    if(!tot){cout<<"0";return 0;}
    sort(divv+1,divv+siz+1);
    for(int i=1;i<=siz;++i){
        ll tmp=n;
        while(tmp%divv[i]==0)tmp/=divv[i];
    }
    for(int i=1;i<=tot;++i)for(int j=1;j<=siz;++j)if(a[i]%divv[j]==0)sta[i]|=1<<(j-1);
    for(int i=0;i<(1<<siz);++i)for(int j=1;j<=tot;++j)
            if((i&sta[j])==0&&i<sta[j])dp[i|sta[j]]+=dp[i];
    cout<<dp[(1<<siz)-1];
    return 0;
}

2018.09.08 NOIP模拟 division(状压dp)的更多相关文章

  1. NOIP模拟 乘积 - 状压dp + 分组背包

    题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...

  2. 2018.09.08 NOIP模拟trip(最长链计数)

    差不多是原题啊. 求最长链变成了最长链计数,其余没有变化. 这一次考试为了保险起见本蒟蒻还是写了上次没写的辅助数组. 代码: #include<bits/stdc++.h> #define ...

  3. 2018.09.08 NOIP模拟eat(贪心)

    签到水题啊... 这题完全跟图论没有关系. 显然如果确定了哪些点会被选之后顺序已经不重要了.于是我们给点按权值排序贪心从大向小选. 我们要求的显然就是∑i(a[i]−(n−i))" role ...

  4. 2018.10.24 bzoj2064: 分裂(状压dp)

    传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...

  5. 2018.10.08 NOIP模拟 栅栏(树状数组+rand)

    传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...

  6. 2018.11.08 NOIP模拟 班车(倍增+dfs+bit)

    传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果 ...

  7. 2018.11.08 NOIP模拟 水管(简单构造)

    传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码

  8. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

  9. 2018.10.08 NOIP模拟 序列(主席树)

    传送门 T2防ak题? 其实也不是很难(考试时sb了). 直接变形一下求出区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤l1−1\le l1-1≤l1−1的区间数,和区间长度在[l ...

随机推荐

  1. RabbitMQ 端口号解析

    转自:https://www.cnblogs.com/liuxingke/articles/9889517.html 端口号解析 12345 - 4369 (epmd), 25672 (Erlang ...

  2. 21OGNL与ValueStack(VS)-静态方法访问

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在LoginAction中增加如下方法: public static Str ...

  3. JDK1.7之后switch支持string

    转自:https://blog.csdn.net/tjcyjd/article/details/9666035 在Java7之前,switch只能支持 byte.short.char.int或者其对应 ...

  4. 将 MyBatis3 的支持添加到 Spring

    http://www.mybatis.org/spring/zh/index.html What is MyBatis-Spring? MyBatis-Spring 会帮助你将 MyBatis 代码无 ...

  5. RAID0+1 RAID5 性能比较

    我想大家都很清楚,存储设备性能的好坏除了与处理器(CPU).缓存等有关之外,还与RAID组中的磁盘数量有很大的关系.按RAID技术的特点,相同磁盘数量下的RAID0性能高于RAID5,RAID1的性能 ...

  6. 前端-javascript-ECMAScript5.0

    -前端常用开发工具:sublime.visual Studio Code.HBuilder.Webstorm. 使用的PCharm跟WebStorm是JetBrains公司推出的编辑工具,开发阶段建议 ...

  7. kafka offset 设置

    from kafka import KafkaConsumer from kafka import TopicPartition from kafka.structs import OffsetAnd ...

  8. object-c语法

    Objective-C:C的超集 Objective-Objective-C是C语言的严格超集--任何C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言 ...

  9. form表单重置、清空方法记录

    myform 是form的id属性值 1.调用reset()方法 function fomrReset() { document.getElementById("myform"). ...

  10. node.js实时编译,不需要重启

    npm -g install supervisor 全局安装这个,然后编译依一次文件就可以了,之后修改这个文件不用编译也可以了