首页 > 代码库 > POJ 1845

POJ 1845

接下来交给大家一个网上查不到的解题方法

题目是酱找出a^b的因子的和答案对9901取模

我们将a可变成这样e1^x1*e2^x2...(ei为素数)

答案就变成这样(e1^0+e1^1...e1^x1)*(e2^0+e2^1...e2^x2)...

利用同余模定理我们可以知道每个e都能变成e%9901

而又由某元素作单位元生成的新的子群是循环的,并且在9901是素数的情况下我门可以知道x>= 2的时候生成的模9901后的数字是每9900个一循环并且不重复,那么当x>=2的时候我们就可以将幂模9900,0和1特判一下,简单观察就能知道0的时候return 1,1的时候return 幂+1;

over~

技术分享
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;//#define __int64 long longconst __int64 mod = 9901;__int64 ss(__int64 a, __int64 b){    a %= mod;    if(a == 0)return 1;    //if(a == 1) return b+1;    b = b % (mod-1);    __int64 ans = 0;    __int64 m = 1;    for(__int64 i =0 ;i <= b; i++){        ans += m % mod;        ans %= mod;        m = (m*a)%mod;    }    return ans;}int main(){    //freopen("in.cpp", "r", stdin);    //freopen("out1.cpp", "w", stdout);    __int64 a, b;    while(cin>>a>>b){        if(a == 0 ){printf("0\n");continue;}        __int64 ans = 1;        for(__int64 i = 2; i*i <= a; i++){            __int64 k = 0;            while(a%i == 0){                a/= i;                k ++;            }            ans = (ans * ss(i, k*b))%mod;        }        if(a > 1)            ans = (ans * ss(a,b))%mod;        cout<<ans<<endl;    }}
View Code

 

POJ 1845