zoukankan      html  css  js  c++  java
  • NOIP 模拟 $38; m b$

    题解 (by;zjvarphi)

    考虑转化问题,将计算最大公约数换为枚举最大公约数。

    (sum_i) 为最大公约数为 (i) 的方案数,可以容斥求解,(sum_i=f_i-sum_{j=2}^{j*ile mx} sum_{j*i})

    (f_i) 表示最大公约数是 (i) 的倍数的方案数,设 (g_{i,j}) 为第 (i) 行,倍数为 (j) 的有几个。

    最后记得算不选的情况,还要加去一个没选的情况。

    Code
    #include<bits/stdc++.h>
    #define Re register
    #define ri Re signed
    #define p(i) ++i
    namespace IO{
        char buf[1<<21],*p1=buf,*p2=buf;
        #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
        struct nanfeng_stream{
            template<typename T>inline nanfeng_stream &operator>>(T &x) {
                Re bool f=0;x=0;Re char ch=gc();
                while(!isdigit(ch)) f|=ch=='-',ch=gc();
                while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
                return x=f?-x:x,*this;
            }
        }cin;
    }
    using IO::cin;
    namespace nanfeng{
        #define FI FILE *IN
        #define FO FILE *OUT
        template<typename T>inline T cmax(T x, T y) {return x>y?x:y;}
        template<typename T>inline T cmin(T x, T y) {return x>y?y:x;}
        typedef long long ll;
        static const int M=1e5+7,N=22,MOD=1e9+7;
        int cnt[N][M],ct[N][M],sum[M],mx,n,m,ans;
        inline int main() {
            //FI=freopen("nanfeng.in","r",stdin);
            //FO=freopen("nanfeng.out","w",stdout);
            cin >> n >> m;
            for (ri i(1);i<=n;p(i))
                for (ri j(1),a;j<=m;p(j)) {
                    cin >> a;
                    ++ct[i][a];
                    mx=cmax(mx,a);
                }
            for (ri i(1);i<=n;p(i)) 
                for (ri j(1);j<=mx;p(j))
                    for (ri k(1);k*j<=mx;p(k))
                        cnt[i][j]+=ct[i][k*j];
            for (ri i(mx);i;--i) {
                sum[i]=1;
                for (ri j(1);j<=n;p(j))
                    sum[i]=(ll)sum[i]*(cnt[j][i]+1)%MOD;
                sum[i]=(sum[i]-1+MOD)%MOD;
                if (!sum[i]) continue;
                for (ri k(2);k*i<=mx;p(k))
                    sum[i]=(sum[i]-sum[k*i]+MOD)%MOD;
                ans=(ans+(ll)sum[i]*i%MOD)%MOD;
            }
            printf("%d
    ",ans);
            return 0;
        }
    }
    int main() {return nanfeng::main();}
    
  • 相关阅读:
    使用B或BL跳转时,下一条指令的地址的计算
    【flask-Email】邮件发送
    【MAC】 命令行解压缩 rar 文件
    【flask_sqlalchemy】模糊查询
    【python】集合 list差集|并集|交集
    【pycharm】Mac版快捷键
    【mysql】查询最新的10条记录
    【Python】—— 获取当前运行函数名称和类方法名称
    【Python】—— 获取函数内部变量名称
    【python3】 抓取异常信息try/except
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/15139180.html
Copyright © 2011-2022 走看看