Loading

NOIP 模拟 $38\; \rm b$

题解 \(by\;zj\varphi\)

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

\(sum_i\) 为最大公约数为 \(i\) 的方案数,可以容斥求解,\(sum_i=f_i-\sum_{j=2}^{j*i\le 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\n",ans);
        return 0;
    }
}
int main() {return nanfeng::main();}
posted @ 2021-08-13 21:28  ナンカエデ  阅读(41)  评论(0编辑  收藏  举报