这么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. IdUDPServer中文汉字乱码 及IdTCPClient

    官网 http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdTCPServer_OnExec ...

  2. jq js 对象互转

    . DOM 对象转成 jQuery 对象 对于已经是一个 DOM 对象,只需要用 $() 把DOM对象包装起来,就可以获得一个 jQuery 对象了,$(DOM 对象) 注: var是定义变量 如: ...

  3. EditorGUILayout,GUILayout

    bool active=EditorGUILayout.Toggle("active",_bodyObj.active);//bool类型 b2BodyType type=(b2B ...

  4. MS-SQL

    变量 一个@为局部变量,两个@@为全局变量 @@error 最后一句SQL语句的错误编号 错误码 @@identity最后一次插入的标示值符 insert into biao(lie) output ...

  5. 在windows 2008 R2中SQl Server 2008中代理启动失败的一个原因总结

    启动SQL代理的时候报错如下: 关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾. ************** 异常文本 **************System.NullRef ...

  6. scala sparseVetor, SprseMatrix 实现

    def rand(seed:Int):Double={ val rand=new Random(seed) rand.nextDouble()} def rand2(size:Int,seed:Int ...

  7. 断开的管道 java.io.IOException: Broken pipe 解决方法

    一.Broken pipe产生原因分析 1.当访问某个服务突然服务器挂了,就会产生Broken pipe; 2.客户端读取超时关闭了连接,这时服务器往客户端再写数据就发生了broken pipe异常! ...

  8. twitter 等网站console.log不能使用,可用alert或者

    function setConsole() { var iframe = document.createElement('iframe'); iframe.style.display = 'none' ...

  9. 华为手机不打印log解决方法

    在拨号界面输入:*#*#2846579#*#*    进入后台设置---log设置---开启AP日志...开关即可

  10. 【MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.

    原文参考:http://wuzhuti.cn/2348.html 之前在centos6.4系统安装的是自带的mysql 5.1版本,后来升级到了5.6版本,执行以下命令报错 在网上查找原因说说因为升级 ...