[关闭]
@sensitive-cs 2016-11-23T10:03:16.000000Z 字数 827 阅读 661

11.23

数论

---欧几里得,埃拉托色尼筛,二分快速幂,同余定理

欧几里得,每一次递归,返回的就是由最后一次递归计算出的结果

  1. #include <stdio.h>
  2. int gcd(int n,int m)
  3. {
  4. if (m == 0)
  5. return n;
  6. else
  7. return gcd(m,n % m);
  8. }
  9. int main(void)
  10. {
  11. int a,b;
  12. int ans;
  13. scanf("%d%d",&a,&b);
  14. ans = gcd(a,b);
  15. printf("%d\n",ans);
  16. return 0;
  17. }

强大的埃拉托色尼筛,思想就是把所有素数的倍数标记为0:

  1. #include <stdio.h>
  2. #include <math.h>
  3. #define n 10005
  4. int a[n];
  5. int main(void)
  6. {
  7. int i,j;
  8. for (i = 2;i <= n;i++)
  9. a[i] = 1;
  10. for (i = 2;i <= sqrt(n);i++)
  11. {
  12. if (a[i])
  13. {
  14. for (j = 2;i * j <= n;j++)
  15. a[i*j] = 0;
  16. }
  17. }
  18. for (i = 2;i <= n;i++)
  19. if (a[i])
  20. printf("%4d ",i);
  21. return 0;
  22. }

二分快速幂 + 同余定理:
拆分的思想,但是拆分是有规律的。
至于同余定理,则是(a*b) mod m = (a mod m) * (b mod m),加法是每加一次,膜一次(蛤。减法是给被减数加上m之后先算减法,后算 mod m。
求m的n次方:

  1. #include <stdio.h>
  2. const long long t = 1000000007;
  3. long long _pow(long long x,long long n)
  4. {
  5. if (n == 0)
  6. return 1;
  7. else if (n % 2 == 0)
  8. return _pow(x*x,n / 2) % t;
  9. else
  10. return _pow(x*x,n / 2) * x % t;
  11. }
  12. int main(void)
  13. {
  14. int x,n;
  15. long long ans = 0;
  16. scanf("%d%d",&x,&n);
  17. ans = _pow(x,n);
  18. printf("%I64d\n",ans);
  19. return 0;
  20. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注