zoukankan      html  css  js  c++  java
  • Sumdiv【POJ-1845】

    题目链接

    题意:求AB的所有因子(包括1和它本身)的和。

    思路:看似简单,实际上暗藏玄机!

    很明显,我们可以用O(sqrt(A))的做法,求出A的所有质因子,以及该质因子出现的次数,此时再举个例子,我们发现12可以由2的2次幂和3的一次幂组成,我们现在想求12的所有因子的组成,可以看成(1 + 2 + 22)*(1 + 3)。同理,如果最高次幂到达了B次,我们实际上是给最高次幂乘上一个B,然后做个等比数列求和就可以了。

    当然,此题暗藏玄机!

    我们可以发现,当等比数列的比q,当q % mod == 1时候,会发现,原式变成了0/0型,但是实际上,这样的答案是有值的,应该为项数之和。

    所以,我们特殊处理一下q % mod == 1的时候,就可以了,以后也要注意等比数列的“0 / 0”型!

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <limits>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <set>
    #include <map>
    #include <bitset>
    #define lowbit(x) ( x&(-x) )
    #define pi 3.141592653589793
    #define e 2.718281828459045
    #define INF 0x3f3f3f3f
    #define HalF (l + r)>>1
    #define lsn rt<<1
    #define rsn rt<<1|1
    #define Lson lsn, l, mid
    #define Rson rsn, mid+1, r
    #define QL Lson, ql, qr
    #define QR Rson, ql, qr
    #define myself rt, l, r
    #define pii pair<int, int>
    #define MP(a, b) make_pair(a, b)
    using namespace std;
    typedef unsigned long long ull;
    typedef unsigned int uit;
    typedef long long ll;
    const ll mod = 9901, P = mod - 1;
    ll qpow(ll a, ll b = mod - 2)
    {
        ll ans = 1;
        while(b)
        {
            if(b & 1LL) ans = ans * a % mod;
            a = a * a % mod;
            b >>= 1LL;
        }
        return ans;
    }
    ll A, B;
    int main()
    {
        scanf("%lld%lld", &A, &B);
        ll ans = 1LL, tim = 0, q;
        for(int i = 2; 1LL * i * i <= A; i ++)
        {
            if(A % i == 0)
            {
                tim = 0;
                while(A % i == 0)
                {
                    A /= i;
                    tim ++;
                }
                q = i % mod;
                if(q == 1)
                {
                    ans = ans * (B % mod * tim % mod + 1LL) % mod;
                }
                else
                {
                    ll fz = (qpow(i, (B % P * tim + 1LL) % P) - 1LL + mod) % mod;
                    ll fm = (i - 1LL + mod) % mod;
                    ll tmp = fz * qpow(fm) % mod;
                    ans = ans * tmp % mod;
                }
            }
        }
        if(A > 1)
        {
            q = A % mod;
            if(q == 1)
            {
                ans = ans * (B % mod + 1LL) % mod;
            }
            else
            {
                ll fz = (qpow(A % mod, (B % P + 1LL) % P) - 1LL + mod) % mod;
                ll fm = (A - 1LL + mod) % mod;
                ll tmp = fz * qpow(fm) % mod;
                ans = ans * tmp % mod;
            }
        }
        printf("%lld
    ", ans);
        return 0;
    }
  • 相关阅读:
    pandas DataFrame
    pandas Series
    numpy nan和inf
    Filder配置及使用教程
    Vmware Ubuntu18.04更换清华源
    numpy 其它常用方法
    numpy 数组的拼接
    numpy 数值的修改
    numpy 索引和切片
    class 绑定的数据对象不必内联定义在模板里
  • 原文地址:https://www.cnblogs.com/WuliWuliiii/p/14595557.html
Copyright © 2011-2022 走看看