POJ 1845-Sumdiv 数论 +快速幂&&筛素&&分解质因数&&求因数之和的模板

原创 2015年11月20日 23:35:55

poj计划的第一个坎,非常经典的一道题在此记录一下以后总结
知识点:
1 (a+b)%c = (a%c+b%c)%c
(a*b)%c = ((a%c)*(b%c))%c

2 计算a^n 要用快速幂((logn)渣渣我都能迅速打出来)

3 任何数都能分解成几个质因数相乘

4 求一个数的所有因数之和 = (a^0+a^1+a^2+a^3+….a^n) * ( a1^0+a1^1+a1^2+a1^3+….a1^n1)* (a2^0+a2^1+a2^2+a2^3+….a2^n2)…..*(an^0+an^1+an^2+an^3+….an^nn)
其中a,a1,a2,,,,代表它的质因数,n,n1,n2….nn代表它所代表的质因数的个数

5 二分求a^0+a^1+a^2……a^n的结果,二分很抽象新手难以想到现屡一下思路。。。
(1) 先分析n为奇数时a^n/a^(n/2)=a^(n/2+1)/a^0=a^(n/2+2)/a^1=…=a^(n/2+1);
所以 a^0+a^1+a^2……a^n = a^0+a^1+a^2+….a^n/2+a^(n/2+1)( a^0+a^1+a^2+….a^n/2) = (1+a^(n/2+1) (a^0+a^1+a^2+….a^n/2 )
(2)当分析n为偶数时同分析奇数一样都有对应关系,下标0跟n/2+1,1跟n/2+2……n/2-1跟n所代表的a值相除都可以得同一个系数为a^(n/2+1)。但有一组不一样就是a^n/2;
没有系数与它对应所以要另算
所以递推公式为a^0+a^1+a^2……a^n = a^0+a^1+a^2+….a^n/2+a^(n/2+1)( a^0+a^1+a^2+….a^(n/2-1)) = (1+a^(n/2+1) (a^0+a^1+a^2+….a^(n/2-1 ))+a^(n/2);

6 细心该取模的地方别忘写了一下写对不然以后查错很麻烦,同时这种数论题数据很作你是不能想出特殊数据的,要中途wa只能眼睛干瞪差错(写给马虎的渣渣自己)

PS: 我也看题解写的。。。但题解都写得很简单,一股装逼的味道。。。我自己还是要屡一下证明的细节要不就是全抄的了。。另外把这个当以后的模板了很有用的。

//2015.11.20 by blacktea
//筛素数&&分解质因子&&快速幂&&二分求所有因子的和->模板
#include<cstdio>
#include<cstring>
#define mod 9901
int am[10000],x,n,l=0,pri[10000],prix[2000],l1;
__int64 priam[2000];
void toGetPrime()//筛素数
{
    for(int i=2;i<=10000;i++)
    if(!am[i]){
        pri[l] = i;
        l++;
        for(int j=2;j*i<=10000;j++)
          am[i*j] = 1;
    }
}
void toApartPrime()//分解质因子
{
   memset(priam,0,sizeof(priam));
   l1=0;
   for(int i=0;pri[i]*pri[i]<=x;i++)
   {
        if(!(x%pri[i])){
        prix[l1] = pri[i];
          while(x%pri[i]==0)
          {
          x/=pri[i];
          priam[l1]++;
          }
          priam[l1]*=n;
          l1++;
       }
   }
   if(x!=1){prix[l1] = x;priam[l1] = 1;priam[l1]*=n;l1++;}
}
int pow_m(int a,__int64 n)//快速幂
{
    a%=mod;
    int result = 1,pre = a;
    while(n)
    {
       if(n&1)
       {result *= pre;result %= mod;}
       pre*=pre;
       pre%=mod;
       n>>=1;
    }
    return result;
}
int toCalculate(int a,__int64 sum)//二分求所有因子的和
{
   int result = 1;
   if(sum==0)return 1;
   if(sum%2)result = ((1+pow_m(a,sum/2+1))%mod)*toCalculate(a,sum/2);
   else result = ((1+pow_m(a,sum/2+1))%mod)*toCalculate(a,sum/2-1)+pow_m(a,sum/2);
   result%=mod;
   return result;
}
int main()
{
    toGetPrime();
    while(scanf("%d%d",&x,&n)!=EOF)
    {
      int result =1;
      if(x==1){printf("1\n");continue;}
      else if(x==0){printf("0\n");continue;}
      toApartPrime();
      for(int i=0;i<l1;i++)
      {
         result*=toCalculate(prix[i],priam[i]);
         result%=mod;
      }
      printf("%d\n",result);
    }
    return 0;
}

POJ 1845 Sumdiv(质因数分解+快速幂+二分法求等比数列的和)

题目大意:求 A ^ B 的所有约数的和 模 9901 的值。 解题思路: 1、对A进行素因子分解得:      A  =  p1^a1  *  p2^a2  *  p3^a3  * ... ...

POJ1845 Sumdiv【因数之和】【二分求等比数列】

题目大意: 对于两个自然数A和B,令s = A^B所有约数和,计算s%9901的结果是多少 思路: 小優的博客对这道题写的非常好,参考博文:http://blog.csdn.net/lyy28906...

poj 1845 Sumdiv(数论:欧拉函数+二分求等比数列前n项和+快速幂取模)

很凶残的一道题啊... 给定一个n先用欧拉函数求出

poj_1845 Sumdiv(素因子分解+快速幂+约数和+二分求等比数列和)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19949   Accept...

POJ 1845 Sumdiv (快速幂+质因数+约数和公式+同余模)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16109   Accepted: 3992 ...

POJ 1845 Sumdiv(数论+快速幂)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19576   Accept...
  • nare123
  • nare123
  • 2016年09月19日 23:48
  • 127

POJ1845 Sumdiv【快速模幂+素因子分解+等比数列+二分法】

问题链接:POJ1845 Sumdiv。 问题简述:参见上述链接。 问题分析:计算a^b的因子数,首先要对a进行因子分解,然后再进行计算。 程序说明:计算过程中用到了快速模幂函数。 题记:(略) ...

Sumdiv(数论综合模板题:快速分解因式+快速幂取模+约数和公式+递归二分求等比数列和)

Link:http://poj.org/problem?id=1845 Sumdiv Time Limit: 1000MS   Memory L...

POJ 1845 Sumdiv【同余模运算+递归求等比数列和+快速幂运算】

快速幂运算在第一次训练时候就已经遇到过,这里不赘述 同余模运算也很简单,这里也不说了,无非是(a+b)%m (a*b)%m 把m弄到里面变成(a%m+b%m)%m   (a%m*b%m)%m 今...

poj 1845 Sumdiv(二分递归求等比数列+素因子分解)

题目:http://poj.org/problem?id=1845 Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Sub...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1845-Sumdiv 数论 +快速幂&&筛素&&分解质因数&&求因数之和的模板
举报原因:
原因补充:

(最多只允许输入30个字)