zoukankan      html  css  js  c++  java
  • UVA12546 LCM Pair Sum

    传送门

    设 $n=prod_{i=1}^{m}p_{i}^{k_i}$

    对每个质因子单独考虑,如果 $a$ 的这个质因子 $p_i$ 的次数小于 $k_i$,那么 $b$ 的这个质因子次数必须为 $k_i$

    考虑 $a$ 这个质因子有多少种的取值,如果取 $p_{i}^{0}$ 到 $p_{i}^{k_i-1}$ 那么 $b$ 都为 $p_{i}^{k_i}$

    那么这种情况对 $a$ 的贡献就是 $sum_{j=0}^{k_i-1}p_{i}^{j}$

    如果 $a$ 取 $p_{i}^{k_i}$ ,那么 $b$ 可以取 $p_{i}^{0}$ 到 $p_{i}^{k_i}$,一共有 $k_i+1$ 对

    综合一下,$a$ 的这个质因子可以取的总和为 $sum_{j=0}^{k_i}p_{i}^{j}+k_{i} cdot p_{i}^{k_i}$

    因为 $a$ 是各个质因子乘起来的结果,所以根据乘法原理 $a$ 的所有取值的总和为 $prod_{i=1}^{m}(sum_{j=0}^{k_i}p_{i}^{j}+k_{i} cdot p_{i}^{k_i})$

    $b$ 也同理,然后发现这样把 $a,b$ 看成了有序数对,除了 $(n,n)$ 以外都算了两次,所以把和加上 $(n+n)$ 再除以 $2$ 就是答案了

    $sum_{j=0}^{k_i}p_{i}^{j}$ 就是个等比数列求和的式子,公式直接套就行了

    注意是在模意义下,套式子的时候负数要转正,除法要转逆元

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int mo=1000000007;
    int T,m,a[17],b[17];
    inline ll ksm(ll x,ll y)
    {
        ll res=1;
        while(y)
        {
            if(y&1) res=res*x%mo;
            x=x*x%mo; y>>=1;
        }
        return res;
    }
    inline ll F(int a,int x) { return 1ll*(1-ksm(a,x+1)+mo)*ksm(1-a+mo,mo-2)%mo; }
    int main()
    {
        T=read();
        for(int k=1;k<=T;k++)
        {
            m=read();
            for(int i=1;i<=m;i++) a[i]=read(),b[i]=read();
            ll n=1,ans=1;
            for(int i=1;i<=m;i++)
            {
                ll g=ksm(a[i],b[i]),t=(F(a[i],b[i])+1ll*b[i]*g%mo)%mo;
                ans=ans*t%mo; n=n*g%mo;
            }
            ans=(ans*2+(n+n))%mo; ans=ans*ksm(2,mo-2)%mo;
            printf("Case %d: %lld
    ",k,ans);
        }
        return 0;
    }
  • 相关阅读:
    HDU 1176 免费馅饼(DP)
    微通道的兵锋 阿里将血腥
    head first c&lt;11&gt;在根据网络编程
    ZOJ 3795 Grouping(Tarjan收缩点+DAG)
    【设计和算法分析】3、二进制搜索
    杨:联想的创新将成为打造最酷的助推力的重要器件
    android 如何将电话簿SDN数字和其他普通的数字混合在一起?
    redhat6.3已安装was6.1你可以不弹出安装程序
    Android属于查询执行情况的电话号码
    table在 点击线条颜色
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11496596.html
Copyright © 2011-2022 走看看