WuliWuliiii
凤兮凤兮归故乡 遨游四海求其凰

题目链接

题意:求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\n", ans);
    return 0;
}

 

posted on 2021-03-30 10:08  唔哩Wulili  阅读(67)  评论(0编辑  收藏  举报