码迷,mamicode.com
首页 > 其他好文 > 详细

Sumdiv【POJ-1845】

时间:2021-03-31 11:50:11      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:font   hal   stack   rgba   names   链接   blank   lan   mod   

题目链接

题意:求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;
}

 

Sumdiv【POJ-1845】

标签:font   hal   stack   rgba   names   链接   blank   lan   mod   

原文地址:https://www.cnblogs.com/WuliWuliiii/p/14595557.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!