您的位置:首页 > 其它

POJ 1845.Sumdiv

2017-12-07 18:02 323 查看
题目:http://poj.org/problem?id=1845

AC代码(C++):

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>

#define INF 0xfffffff
#define MAXN 100105

using namespace std;

const int mod = 9901;

int quick(int a,int b)
{
int c = mod;
int ans=1;
a=a%c;
while(b!=0)
{
if(b&1) ans=(ans*a)%c;
b>>=1;
a=(a*a)%c;
}
return ans;
}

long long sum(long long p, long long n){
if(n==0)return 1;
else if(n%2==0)return (sum(p,n/2-1)*(1+quick(p,n/2+1))%mod+quick(p,n/2))%mod;
else return (sum(p,n/2)*(1+quick(p,n/2+1)))%mod;
}

int main(){
int A,B;
int p[10000],n[10000];
cin>>A>>B;
int j = 0;
for(int i = 2; i*i <= A;){
if(A%i==0){
p[j]=i;
n[j]=0;
while(A%i==0){
n[j]++;
A/=i;
}
j++;
}
if(i==2)i++;
else i+=2;
}
if(A!=1){
p[j]=A;
n[j]=1;
j++;
}
long long ans = 1;
for(int i = 0; i < j; i++)ans = (ans*sum(p[i],n[i]*B))%mod;

cout<<ans;
}

总结: 总结下这题用的数学方法:

1.整数的唯一分解定理:

任何整数都有且只有一种方式写出其素数因子的乘积表达式.

A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)   其中pi均为素数

2.约数和公式:

对上述已经分解的A, 有A的所有因子之和为

S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)

3.同余模公式:

(a+b)%m=(a%m+b%m)%m

(a*b)%m=(a%m*b%m)%m

4.二分求等比数列:

(1)若n为奇数, 一共有偶数项, 则:

      1 + p + p^2 + p^3 +...+ p^n

      = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))

      = (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))

(2)若n为偶数, 一共有奇数项, 则:

      1 + p + p^2 + p^3 +...+ p^n

      = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)

      = (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);

5.快速幂取模.

题目解法参考: https://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122790.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: