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

POJ 1845

时间:2015-02-02 21:17:38      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

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

题目是酱找出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 long
const __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

标签:

原文地址:http://www.cnblogs.com/icodefive/p/4268571.html

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