POJ 1845.Sumdiv
2017-12-07 18:02
323 查看
题目:http://poj.org/problem?id=1845
AC代码(C++):
总结: 总结下这题用的数学方法:
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
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
相关文章推荐
- POJ1470/ZOJ1141 Closest Common Ancestors(LCA离线算法)
- poj-3259-Wormholes-BF
- POJ 2686 Traveling by Stagecoach
- 关于SPFA,记一点小悲催 poj 3159
- POJ - 3187 Backward Digit Sums
- POJ--1966--Cable TV Network【无向图顶点连通度】
- POJ 1018 Communication System
- POJ 3009Curling 2.0(DFS)
- poj1458——Common Subsequence(最长公共子序列)
- poj 2513 Colored Sticks
- poj 2349 Arctic Network 最小生成树
- poj 2917 Diophantus of Alexandria 因数分解解1/x+1/y=1/n
- POJ 3372 Candy Distribution
- poj 3259 Wormholes spfa算法
- POJ 3168 排序+扫描
- POJ 1830 开关问题 [高斯消元XOR]
- POJ 1724 花销限制的最短路径
- poj 1523
- POJ 1236 Network of Schools(强连通分量)
- POJ 3468 A Simple Problem with Integers(线状树经典模型之lazy操作)