模版整理:

晒素数

  1. void init()
  2. {
  3. cas = ;
  4. for (int i = ; i < MAXD ; i++) is_prime[i] = true;
  5. is_prime[] = is_prime[] = false;
  6. for (int i = ; i < MAXD ; i++)
  7. {
  8. if (is_prime[i])
  9. {
  10. prime[cas++] = i;
  11. for (int j = i + i ; j < MAXD ; j += i)
  12. is_prime[j] = false;
  13. }
  14. }
  15. }

合数分解

  1. int x = src[i];
  2. int cnt = ,tot = ;
  3. for (int j = ; j < cas && prime[j] * prime[j] <= x ; j++)
  4. {
  5. if (x % prime[j] == )
  6. {
  7. res[cnt++] = prime[j];
  8. while (x % prime[j] == )
  9. {
  10. tot++;
  11. x /= prime[j];
  12. }
  13. }
  14. }
  15. if (x > )
  16. {
  17. res[cnt++] = x;
  18. tot++;
  19. }

大素数筛。1-2^31内某个长度小于10W的区间的素数个数

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. LL prime[MAXN / ];
  24. bool is_prime[MAXN + ];
  25. bool flag[MAXN + ] ;
  26. int cas;
  27.  
  28. void init()
  29. {
  30. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  31. is_prime[] = false;
  32. is_prime[] = false;
  33. cas = ;
  34. for (int i = ; i < MAXN ; i++)
  35. {
  36. if (is_prime[i])
  37. {
  38. prime[cas++] = i;
  39. for (int j = i + i ; j < MAXN ; j += i)
  40. is_prime[j] = false;
  41. }
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. init();
  48. int T,kase = ;
  49. scanf("%d",&T);
  50. while (T--)
  51. {
  52. LL a,b;
  53. scanf("%lld%lld",&a,&b);
  54. if (b <= )
  55. {
  56. int cnt = ;
  57. for (int i = a ; i <= b ; i++)
  58. if (is_prime[i]) cnt++;
  59. printf("Case %d: %d\n",kase++,cnt);
  60. continue;
  61. }
  62. else
  63. {
  64. if (a <= ) a = ;
  65. int sz = b - a;
  66. for (int i = ; i <= sz ; i++) flag[i] = true;
  67. for (int i = ; i < cas && prime[i] * prime[i] <= b ; i++)
  68. {
  69. int k = a / prime[i];
  70. if (k * prime[i] < a) k++;
  71. if (k <= ) k++;
  72. while (k * prime[i] <= b)
  73. {
  74. flag[k * prime[i] - a] = false;
  75. k++;
  76. }
  77. }
  78. int cnt = ;
  79. for (int i = ; i <= sz ; i++)
  80. if (flag[i] == true) cnt++;
  81. printf("Case %d: %d\n",kase++,cnt);
  82. }
  83. }
  84. return ;
  85. }

判断1-N中5的因子的个数,可以将代码5改编

  1. int cnt = ;
  2. while (mid)
  3. {
  4. cnt += mid / ;
  5. mid /= ;
  6. }

中国剩余定理

  1. LL china(int n,int *a,int *m)
  2. {
  3. LL M = ,d,y,x = ;
  4. for (int i = ; i < n ; i++) M *= m[i];
  5. for (int i = ; i < n ; i++)
  6. {
  7. LL w = M / m[i];
  8. gcd(m[i],w,d,d,y);
  9. x = (x + y * w * a[i]) % M;
  10. }
  11. return (x + M) % M;
  12. }

POJ 1061 青蛙的约会

欧几里德解方程

(y+nt)-(x+mt) = k * L;

(n - m)t + K'L = x - y;

求最小正整数解

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. LL gcd(LL a, LL b) {return a % b == ? b : gcd(b, a % b);}
  22. LL ext_gcd(LL a,LL b,LL &x,LL &y)
  23. {
  24. if (a == && b == ) return -;
  25. if (b == )
  26. {
  27. x = ;
  28. y = ;
  29. return a;
  30. }
  31. LL d = ext_gcd(b,a % b,y,x);
  32. y -= a / b * x;
  33. return d;
  34. }
  35. LL x,y,m,n,L;
  36.  
  37. int main()
  38. {
  39. while (scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L) != EOF)
  40. {
  41. LL a = n - m, b = L, c = x - y;
  42. LL d = gcd(a,b);
  43. if (c % d != )
  44. {
  45. puts( "Impossible" );
  46. continue;
  47. }
  48. a /= d;
  49. b /= d;
  50. LL x,y;
  51. ext_gcd(a,b,x,y);
  52. //cout << a << " " << b << " " << x << " " << y << endl;
  53. x *= c / d;
  54. y *= c / d;
  55. //cout << y << endl;
  56. //cout << x << endl;
  57. LL tmp = L / d;
  58. x = (x % tmp + tmp) % tmp;
  59. cout << x << endl;
  60. }
  61. return ;
  62. }

Light Oj 1370 Bi-shoe and Phi-shoe

题意:找到欧拉函数值大于对应数的最小欧拉函数的数

首先素数的欧拉函数值为对应数字减去1

对于任意X,X满足大于等于prime[i],小于等于prime[i + 1],那么这个区间内的所有数字的欧拉函数值都是小于等于

prime[i],那么若想找到欧拉函数大于X的那个值就是大于X的第一个素数

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. /*对任意x,有prime[i]<=x<prime[i+1]必定有EulerPhi[x]<=prime[i],
  23. 要满足phi(p)>=x那么p必定为x后面的第一个素数,进行素数打表即可。*/
  24. const int MAXN = ;
  25. bool is_prime[MAXN];
  26. void init()
  27. {
  28. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  29. is_prime[] = is_prime[] = false;
  30. for (int i = ; i < MAXN ; i++)
  31. {
  32. if (is_prime[i])
  33. {
  34. for (int j = i + i ; j < MAXN ; j += i)
  35. is_prime[j] = false;
  36. }
  37. }
  38. }
  39.  
  40. int main()
  41. {
  42. init();
  43. int T,kase = ;
  44. scanf("%d",&T);
  45. while (T--)
  46. {
  47. int n;
  48. scanf("%d",&n);
  49. LL sum = ;
  50. for (int i = ; i <= n ; i++)
  51. {
  52. int x;
  53. scanf("%d",&x);
  54. for (int j = x + ; j < MAXN ; j++)
  55. {
  56. if (is_prime[j])
  57. {
  58. sum += j;
  59. break;
  60. }
  61. }
  62. }
  63. printf("Case %d: %lld Xukha\n",kase++,sum);
  64. }
  65. return ;
  66. }

Light Oj 1356 Prime Independence

题意:找到最大的子集使得子集内任何2个数之间都不是素数的倍数的关系

此题可以转换成最大独立集来求,不过好像直接用匈牙利算法会T,所以用HK算法

建图:X部为指数为奇数,Y部为指数为偶数,原音:同奇同偶必然不可能构成一个数是另一个数的素数倍数,

一个为奇数一个为偶数时可以试除一个素数看是否存在然后建图求最大独立集合

另外此题我一开始想简单部分奇部偶部来建图最后除以2.这样可能会T。

LightOj 1341 Aladdin and the Flying Carpet

给出整数 a 和 b ,求区间[b, a] 内的 a 的约数对的个数,a 的约数对(比如[2, 3] 与 [3, 2] 为同一对)。

合数分解后得出(a0 ^ p0) * (a1 ^ p1).....

那么约束对个数为(p0 + 1) * (p1 + 1) * (p2 + 1)......  / 2;

然后从1-B枚举判断A的因子对应减去

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. bool is_prime[MAXN];
  24. int cas,prime[MAXN];
  25. LL a,b;
  26.  
  27. void init()
  28. {
  29. cas = ;
  30. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  31. is_prime[] = is_prime[] = false;
  32. for (int i = ; i < MAXN ; i++)
  33. {
  34. if (is_prime[i])
  35. {
  36. prime[cas++] = i;
  37. for (int j = i + i ; j < MAXN ; j += i)
  38. is_prime[j] = false;
  39. }
  40. }
  41. }
  42.  
  43. int tot,cnt;
  44. int num[MAXN],res[MAXN];
  45.  
  46. int main()
  47. {
  48. init();
  49. int T,kase = ;
  50. scanf("%d",&T);
  51. while (T--)
  52. {
  53. scanf("%lld%lld",&a,&b);
  54. if (a <= b * b)
  55. {
  56. printf("Case %d: %d\n",kase++,);
  57. continue;
  58. }
  59. tot = cnt = ;
  60. LL x = a,sum = ;
  61. int i = ;
  62. while(prime[i] < x && i < cas)
  63. {
  64. int val = ;
  65. if (x % prime[i] == )
  66. {
  67. while (x % prime[i] == )
  68. {
  69. x /= prime[i];
  70. val++;
  71. }
  72. }
  73. sum *= (val + );
  74. i++;
  75. }
  76. if (x > )
  77. {
  78. //res[cnt++] = x;
  79. sum *= ;
  80. }
  81. //for (int i = 0 ; i < tot ; i++) sum *= (num[i] + 1);
  82. sum /= ;
  83. for (int i = ; i < b ; i++)
  84. if (a % i == ) sum--;
  85. printf("Case %d: %lld\n",kase++,sum);
  86. }
  87. return ;
  88. }

Light Oj 1336 Sigma Function

定义f(x)为x的所有因子的和,计算H(x)表示从1到X中f(x)为偶数的数字的个数

首先一个数可以表示成(ao ^ p0) * (a1 ^ p1) *......

那么这个数的因子的个数可以表示成(a0 ^ 0 + a0 ^ 1 + ....a0 ^ p0) * (a1 ^ 0 + .... a1 ^ p1) * .....

可见如果为偶数条件很麻烦,如果为奇数那么就是这个所有乘积项全都为奇数

于是问题可以反向来解决,变为统计因子数目为奇数的个数

于是有几个条件第一:如果底数是2,那么这一项构成的乘积项必然是奇数

       第二:如果底数是奇数,那么只有当当前项的次数为偶数的时候该项为奇数

于是判断H(x)我们用二分来判断位置确定答案,对于f(x)为奇数利用DFS操作

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. const LL INF = 1e12;
  24. bool is_prime[MAXN];
  25. int cas,prime[MAXN];
  26. LL a,b;
  27.  
  28. void init()
  29. {
  30. cas = ;
  31. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  32. is_prime[] = is_prime[] = false;
  33. for (int i = ; i < MAXN ; i++)
  34. {
  35. if (is_prime[i])
  36. {
  37. prime[cas++] = i;
  38. for (int j = i + i ; j < MAXN ; j += i)
  39. is_prime[j] = false;
  40. }
  41. }
  42. }
  43.  
  44. LL N;
  45. LL val[];
  46. LL num;
  47.  
  48. void dfs(LL depth,LL sum)
  49. {
  50. val[num++] = sum;
  51. if (depth >= cas) return;
  52. for (LL i = depth ; i < cas ; i++)
  53. {
  54. if (i == )
  55. {
  56. if(sum <= INF / ) dfs(i,sum * 2LL);
  57. else return;
  58. }
  59. else
  60. {
  61. LL res = (LL)prime[i] * (LL)prime[i];
  62. if (sum <= INF / res) dfs(i,res * sum);
  63. else return;
  64. }
  65. }
  66. }
  67.  
  68. LL calcu(LL N)
  69. {
  70. int pos = upper_bound(val,val + num,N)- val;
  71. return pos;
  72. }
  73.  
  74. int main()
  75. {
  76. init();
  77. num = ;
  78. dfs(,);
  79. sort(val,val + num);
  80. int T,kase = ;
  81. scanf("%d",&T);
  82. while (T--)
  83. {
  84. LL N;
  85. scanf("%lld",&N);
  86. LL ret = calcu(N);
  87. printf("Case %d: %lld\n",kase++,N - ret);
  88. }
  89. return ;
  90. }

Light Oj 1282Leading and Trailing

求N的k次方的前三位和后三位

后三位就是简单的快速幂取模

前三位利用log来处理

N ^ k = 10 ^ T,这里T可以为小数,

可以变成10 ^ x * 10 ^ y;这里X表示整数部分,y表示小数部分,那么含义什么

x表示N^k的数字位数,y表示大小。那么实际上求前三位就是求y。

然后利用POW(10,y)进行相应的运算即可

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MOD = ;
  23. LL pow_mod(LL val,LL cnt)
  24. {
  25. LL ret = ;
  26. while (cnt)
  27. {
  28. if (cnt & ) ret = ret * val % MOD;
  29. val = val * val % MOD;
  30. cnt >>= ;
  31. }
  32. return ret;
  33. }
  34.  
  35. int main()
  36. {
  37. int T,kase = ;
  38. scanf("%d",&T);
  39. while (T--)
  40. {
  41. LL a,b;
  42. cin >> a >> b;
  43. double res = pow(10.0,fmod(b * log10(1.0 * a),));
  44. printf("Case %d: %d %03lld\n",kase++,(int)(res * 100.0),pow_mod(a,b));
  45. }
  46. return ;
  47. }

LightOj 1259 Goldbach`s Conjecture

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. bool is_prime[MAXN];
  24. int prime[MAXN / ],cas;
  25. void init()
  26. {
  27. cas = ;
  28. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  29. is_prime[] = is_prime[] = false;
  30. for (int i = ; i < MAXN ; i++)
  31. {
  32. if (is_prime[i])
  33. {
  34. prime[cas++] = i;
  35. for (int j = i + i ; j < MAXN ; j += i)
  36. is_prime[j] = false;
  37. }
  38. }
  39. }
  40.  
  41. int main()
  42. {
  43. init();
  44. int T,kase = ;
  45. scanf("%d",&T);
  46. while (T--)
  47. {
  48. int n;
  49. scanf("%d",&n);
  50. int ret = ;
  51. for (int i = ; i < cas && prime[i] <= n / ; i++)
  52. {
  53. if (is_prime[n - prime[i]]) ret++;
  54. }
  55. printf("Case %d: %d\n",kase++,ret);
  56. }
  57. return ;
  58. }

LightOj 1245 Harmonic Number (II)

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. LL N;
  23. int main()
  24. {
  25. int T,kase = ;
  26. scanf("%d",&T);
  27. while (T--)
  28. {
  29. scanf("%lld",&N);
  30. LL ret = ;
  31. for (LL i = ; i <= sqrt(1.0 * N) ; i++)
  32. ret += N / i;
  33. for (LL i = ; i <= sqrt(1.0 * N) ; i++)
  34. ret += (N / i - N / (i + )) * i;
  35. if (N / (LL)(sqrt(1.0 * N)) == (LL)sqrt(1.0 * N))
  36. ret -= (LL)sqrt(1.0 * N);
  37. printf("Case %d: %lld\n",kase++,ret);
  38. }
  39. return ;
  40. }

LightOj 1236 Pairs Forming LCM

求N2循环中LCM==N的个数

对于N合数分解有N = a1 ^ p1 * a2 ^ p2 * ....

对于i,j的LCM = N

那么有i = b1 ^ q1 * b2 ^ q2 * ......

   j = c1 ^ x1 * c2 ^ x2  * ......

于是有p1 = max(q1,x1)那么就得到答案了。就是qi,xi的组合方案数,另外注意循环的方式和重复计算

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. bool is_prime[MAXN];
  24. int prime[MAXN / ];
  25. int cas;
  26.  
  27. void init()
  28. {
  29. cas = ;
  30. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  31. is_prime[] = is_prime[] = false;
  32. for (int i = ; i < MAXN ; i++)
  33. {
  34. if (is_prime[i])
  35. {
  36. prime[cas++] = i;
  37. for (int j = i + i ; j < MAXN ; j += i)
  38. is_prime[j] = false;
  39. }
  40. }
  41. }
  42.  
  43. int cnt,tot;
  44. LL N;
  45. int num[MAXN / ];
  46.  
  47. int main()
  48. {
  49. init();
  50. int T,kase = ;
  51. scanf("%d",&T);
  52. while (T--)
  53. {
  54. scanf("%lld",&N);
  55. LL x = N;
  56. tot = cnt = ;
  57. LL sum = ;
  58. for (int i = ; i < cas && prime[i] <= x ; i++)
  59. {
  60. if (x % prime[i] == )
  61. {
  62. tot++;
  63. int val = ;
  64. while (x % prime[i] == )
  65. {
  66. val++;
  67. x /= prime[i];
  68. }
  69. sum *= * val + ;
  70. }
  71. }
  72. if (x > )
  73. {
  74. sum *= ;
  75. tot++;
  76. }
  77. sum = sum / + ;
  78. printf("Case %d: %lld\n",kase++,sum);
  79. }
  80. return ;
  81. }

LightOj 1234 Harmonic Number

计算1/1 + 1/2 + 1/3 + 1/4 + .......

这个题有三种处理方法

第一种如果直接开对应数组是开不下的,但是时间上是够的,于是可以适当优化空间,

所遇预先没50个存一组剩下的不满足50一组的直接暴力

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = 1e8;
  23. double ans[MAXN / + ];
  24.  
  25. void init()
  26. {
  27. ans[] = 0.0;
  28. double cur = 0.0;
  29. for (int i = ; i <= MAXN ; i++)
  30. {
  31. cur += 1.0 / (double)i;
  32. if (i % == ) ans[i / ] = cur;
  33. }
  34. }
  35.  
  36. int main()
  37. {
  38. init();
  39. int T,kase = ;
  40. scanf("%d",&T);
  41. while (T--)
  42. {
  43. int N;
  44. scanf("%d",&N);
  45. int st = N / ;
  46. double ret = ans[st];
  47. for (int i = st * + ; i <= N ; i++)
  48. ret += 1.0 / (double)i;
  49. printf("Case %d: %.10lf\n",kase++,ret);
  50. }
  51. return ;
  52. }

第二种是离线处理这个很好。

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const double eps = 1e-;
  23. const int MAXN = ;
  24. struct node
  25. {
  26. int idx,ask;
  27. double ans;
  28. friend bool operator < (const node &a,const node &b)
  29. {
  30. return a.ask < b.ask;
  31. }
  32. }src[MAXN];
  33.  
  34. int cmp(const node&a,const node &b)
  35. {
  36. return a.idx < b.idx;
  37. }
  38.  
  39. int main()
  40. {
  41. int T,kase = ;
  42. scanf("%d",&T);
  43. for (int i = ; i <= T ; i++) scanf("%d",&src[i].ask);
  44. for (int i = ; i <= T ; i++) src[i].idx = i;
  45. sort(src + ,src + + T);
  46. double cur = 0.0;
  47. int step = ;
  48. for (int i = ; i <= 1e8 ; i++)
  49. {
  50. if (step > T) break;
  51. cur = cur + 1.0 / (double)i;
  52. while (src[step].ask == i)
  53. {
  54. src[step].ans = cur;
  55. step++;
  56. }
  57. }
  58. sort(src + ,src + + T ,cmp);
  59. for (int i = ; i <= T ; i++)
  60. {
  61. printf("Case %d: %.10lf\n",kase++,src[i].ans + eps);
  62. }
  63. return ;
  64. }

第三个是神奇的数学结论

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. double ret[MAXN];
  24. #define gamma 0.57721566490153286060651209008240243104215933593992
  25. int N;
  26.  
  27. int main()
  28. {
  29. ret[] = 0.0;
  30. for (int i = ; i < MAXN ; i++) ret[i] = ret[i - ] + 1.0 / (double)i;
  31. int T,kase = ;
  32. scanf("%d",&T);
  33. while (T--)
  34. {
  35. scanf("%d",&N);
  36. printf("Case %d: ",kase++);
  37. if (N < MAXN) printf("%.10lf\n",ret[N]);
  38. else
  39. {
  40. printf("%.10lf\n",(log(N) + log(N + )) / + gamma);
  41. }
  42. }
  43. return ;
  44. }

LightOj 1220 Mysterious Bacteria

求一个数最多是一个数的几次幂

合数分解次数求GCD

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. const int INF = 0x3f3f3f3f;
  24. bool is_prime[MAXN];
  25. int cas,prime[MAXN];
  26.  
  27. void init()
  28. {
  29. cas = ;
  30. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  31. is_prime[] = is_prime[] = false;
  32. for (int i = ; i < MAXN ; i++)
  33. {
  34. if (is_prime[i])
  35. {
  36. prime[cas++] = i;
  37. for (int j = i + i ; j < MAXN ; j += i)
  38. is_prime[j] = false;
  39. }
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45. init();
  46. int T,kase = ;
  47. scanf("%d",&T);
  48. while (T--)
  49. {
  50. int val = ;
  51. LL N;
  52. scanf("%lld",&N);
  53. LL x = N;
  54. if (x < 0LL) x = -x;
  55. for (int i = ; i < cas && prime[i] <= x ; i++)
  56. {
  57. int cnt = ;
  58. if (x % prime[i] == )
  59. {
  60. while (x % prime[i] == )
  61. {
  62. cnt++;
  63. x /= prime[i];
  64. }
  65. val = gcd(val,cnt);
  66. }
  67. }
  68. if (x > )
  69. {
  70. val = ;
  71. }
  72. if (N < )
  73. {
  74. while (val % == ) val /= ;
  75. }
  76. printf("Case %d: %d\n",kase++,val);
  77. }
  78. return ;
  79. }

LightOj 1214 Large Division

判断大数是不是能整除。一个是直接JAVA水,另一个利用同余定理做

JAVA:

  1. import java.util.*;
  2. import java.math.BigInteger;
  3. import java.util.Scanner;
  4.  
  5. public class Main
  6. {
  7. public static void main(String args[])
  8. {
  9. Scanner sc = new Scanner(System.in);
  10. BigInteger a,b,d;
  11. int T;
  12. T = sc.nextInt();
  13. int kase = ;
  14. while (T-- != )
  15. {
  16. a = new BigInteger(sc.next());
  17. b = new BigInteger(sc.next());
  18. a = a.abs();
  19. b = b.abs();
  20. if (a.mod(b).equals(BigInteger.ZERO))
  21. {
  22. System.out.println("Case " + kase++ + ": divisible");
  23. }
  24. else
  25. {
  26. System.out.println("Case " + kase++ + ": not divisible");
  27. }
  28. }
  29. }
  30. }
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. char str[MAXN];
  24. LL m;
  25.  
  26. int main()
  27. {
  28. int T,kase = ;
  29. scanf("%d",&T);
  30. while (T--)
  31. {
  32. scanf("%s%lld",str,&m);
  33. LL cur = ;
  34. int len = strlen(str);
  35. for (int i = ; i < len ; i++)
  36. {
  37. if (str[i] == '-') continue;
  38. cur = (cur * + str[i] - '') % m;
  39. }
  40. if (cur == ) printf("Case %d: divisible\n",kase++);
  41. else printf("Case %d: not divisible\n",kase++);
  42. }
  43. return ;
  44. }

LightOj 1213 Fantasy of a Summation

利用简单的方法计算相应的代码

感觉这个题有点期望的意思

一共有N^K中组合,每种组合K个数字,平均分给N个数字,然后一直乘到一起

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. LL sum;
  24. LL N,K,MOD;
  25. LL src[MAXN];
  26.  
  27. LL pow_mod(LL x,int cnt)
  28. {
  29. LL ret = ;
  30. while (cnt)
  31. {
  32. if (cnt & ) ret = ret * x % MOD;
  33. x = x * x % MOD;
  34. cnt >>= ;
  35. }
  36. return ret;
  37. }
  38.  
  39. int main()
  40. {
  41. int T,kase = ;
  42. scanf("%d",&T);
  43. while (T--)
  44. {
  45. scanf("%lld%lld%lld",&N,&K,&MOD);
  46. for (int i = ; i <= N ; i++)
  47. scanf("%lld",&src[i]);
  48. LL ret = ;
  49. for (int i = ; i <= N ; i++)
  50. {
  51. ret = (ret + src[i]) % MOD;
  52. }
  53. LL val = pow_mod(N,K - );
  54. printf("Case %d: %lld\n",kase++,ret * val % MOD * K % MOD);
  55. }
  56. return ;
  57. }

LightOj 1197 Help Hanzo

区间内素数的个数,大区间的。区间长度很少

大区间筛小区间的题目

利用预先筛根号N的素数然后做就行了。这个是个模版类的问题

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. LL prime[MAXN / ];
  24. bool is_prime[MAXN + ];
  25. bool flag[MAXN + ] ;
  26. int cas;
  27.  
  28. void init()
  29. {
  30. for (int i = ; i < MAXN ; i++) is_prime[i] = true;
  31. is_prime[] = false;
  32. is_prime[] = false;
  33. cas = ;
  34. for (int i = ; i < MAXN ; i++)
  35. {
  36. if (is_prime[i])
  37. {
  38. prime[cas++] = i;
  39. for (int j = i + i ; j < MAXN ; j += i)
  40. is_prime[j] = false;
  41. }
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. init();
  48. int T,kase = ;
  49. scanf("%d",&T);
  50. while (T--)
  51. {
  52. LL a,b;
  53. scanf("%lld%lld",&a,&b);
  54. if (b <= )
  55. {
  56. int cnt = ;
  57. for (int i = a ; i <= b ; i++)
  58. if (is_prime[i]) cnt++;
  59. printf("Case %d: %d\n",kase++,cnt);
  60. continue;
  61. }
  62. else
  63. {
  64. if (a <= ) a = ;
  65. int sz = b - a;
  66. for (int i = ; i <= sz ; i++) flag[i] = true;
  67. for (int i = ; i < cas && prime[i] * prime[i] <= b ; i++)
  68. {
  69. int k = a / prime[i];
  70. if (k * prime[i] < a) k++;
  71. if (k <= ) k++;
  72. while (k * prime[i] <= b)
  73. {
  74. flag[k * prime[i] - a] = false;
  75. k++;
  76. }
  77. }
  78. int cnt = ;
  79. for (int i = ; i <= sz ; i++)
  80. if (flag[i] == true) cnt++;
  81. printf("Case %d: %d\n",kase++,cnt);
  82. }
  83. }
  84. return ;
  85. }

LightOj 1138 Trailing Zeroes (III)

最小的数阶乘末尾的0的个数

每个因子2*5可以出个末尾0,那么有从小到大的过程中,2的数量绝对够多,于是变成了从1到N中5的因子的个数

另外为了优化需要套上一个二分代码。

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. LL Q;
  23. const LL INF = 0x3f3f3f3f;
  24.  
  25. bool judge(LL mid)
  26. {
  27. int cnt = ;
  28. while (mid)
  29. {
  30. cnt += mid / ;
  31. mid /= ;
  32. }
  33. return cnt >= Q;
  34. }
  35.  
  36. int main()
  37. {
  38. int T,kase = ;
  39. scanf("%d",&T);
  40. while (T--)
  41. {
  42. scanf("%lld",&Q);
  43. LL L = ,R = INF;
  44. LL ans = -;
  45. while (L <= R)
  46. {
  47. LL mid = (L + R) / ;
  48. if (judge(mid))
  49. {
  50. R = mid - ;
  51. ans = mid;
  52. }
  53. else L = mid + ;
  54. }
  55. bool flag = true;
  56. LL tmp = ans;
  57. LL val = ;
  58. while (tmp)
  59. {
  60. val += tmp / ;
  61. tmp /= ;
  62. }
  63. if (val != Q) flag = false;
  64. if (flag) printf("Case %d: %lld\n",kase++,ans);
  65. else printf("Case %d: impossible\n",kase++);
  66. }
  67. return ;
  68. }

接下来是几个大白的题目

Uva 11426 GCD - Extreme (II)

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. const int MAXN = ;
  23. int phi[MAXN + ];
  24. LL ret[MAXN + ];
  25.  
  26. void init()
  27. {
  28. memset(ret,,sizeof(ret));
  29. for(int i = ; i <= MAXN ; i++) phi[i] = i;
  30. for(int i = ; i <= MAXN; i ++)
  31. {
  32. if(phi[i] == i)
  33. {
  34. for(int j = i ; j <= MAXN ; j += i)
  35. phi[j] = phi[j] / i * (i - );
  36. }
  37. for(int j = ; j * i <= MAXN ; j ++)
  38. ret[j * i] += j * phi[i];
  39. }
  40. for (int i = ; i <= MAXN ; i++) ret[i] += ret[i - ];
  41. }
  42.  
  43. int main()
  44. {
  45. init();
  46. int N;
  47. while (scanf("%d",&N) != EOF) if (N == ) break;
  48. else printf("%lld\n",ret[N]);
  49. return ;
  50. }

UVA 11754 Codefeat

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. void gcd(LL a,LL b,LL &d,LL &x,LL &y)
  22. {
  23. if (b == ) {d = a; x = ; y = ;}
  24. else {gcd(b,a % b,d,y,x); y -= x * (a / b);}
  25. }
  26. LL china(int n,int *a,int *m)
  27. {
  28. LL M = ,d,y,x = ;
  29. for (int i = ; i < n ; i++) M *= m[i];
  30. for (int i = ; i < n ; i++)
  31. {
  32. LL w = M / m[i];
  33. gcd(m[i],w,d,d,y);
  34. x = (x + y * w * a[i]) % M;
  35. }
  36. return (x + M) % M;
  37. }
  38. const int MAXC = ;
  39. const int MAXK = ;
  40. const int LIMIT = ;
  41. set<int>value[MAXC];
  42. int C,X[MAXC],K[MAXC];
  43. int Y[MAXC][MAXK];
  44. void slove_enum(int S,int bc)
  45. {
  46. for (int c = ; c < C; c++) if (c != bc)
  47. {
  48. value[c].clear();
  49. for (int i = ; i < K[c] ; i++) value[c].insert(Y[c][i]);
  50. }
  51. for (int t = ; S != ; t++)
  52. {
  53. for (int i = ; i < K[bc] ; i++)
  54. {
  55. LL n = (LL)X[bc] * t + Y[bc][i];
  56. if (n == ) continue;
  57. bool flag = true;
  58. for (int c = ; c < C; c++)
  59. {
  60. if (c != bc)
  61. {
  62. if (value[c].count(n % X[c]) == ) {flag = false; break;}
  63. }
  64. }
  65. if (flag) { printf("%lld\n",n); if (--S == ) break;}
  66. }
  67. }
  68. }
  69. int a[MAXC];
  70. vector<LL>sol;
  71. void dfs(int depth)
  72. {
  73. if (depth == C) sol.push_back(china(C,a,X));
  74. else for (int i = ; i < K[depth]; i++)
  75. {
  76. a[depth] = Y[depth][i];
  77. dfs(depth + );
  78. }
  79. }
  80. void slove_china(int S)
  81. {
  82. sol.clear();
  83. dfs();
  84. sort(sol.begin(),sol.end());
  85. LL M = ;
  86. for (int i = ; i < C; i++) M *= X[i];
  87. vector<LL>ans;
  88. for (int i = ; S != ; i++)
  89. {
  90. for (int j = ; j < (int)sol.size(); j++)
  91. {
  92. LL n = M * i + sol[j];
  93. if (n > )
  94. {
  95. printf("%lld\n",n);
  96. if (--S == ) break;
  97. }
  98. }
  99. }
  100. }
  101. int main()
  102. {
  103. int S;
  104. while (scanf("%d%d",&C,&S) != EOF)
  105. {
  106. if (C == ) break;
  107. LL tot = ;
  108. int best = ;
  109. for (int c = ; c < C ; c++)
  110. {
  111. scanf("%d%d",&X[c],&K[c]);
  112. tot *= K[c];
  113. for (int i = ; i < K[c]; i++) scanf("%d",&Y[c][i]);
  114. sort(Y[c],Y[c] + K[c]);
  115. if (K[c] * X[best] < K[best] * X[c]) best = c;
  116. }
  117. if (tot > LIMIT) slove_enum(S,best);
  118. else slove_china(S);
  119. printf("\n");
  120. }
  121. return ;
  122. }

UVA 11916 Emoogle Grid

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. LL N,K,B,R;
  23. const LL MOD = ;
  24. const int MAXN = ;
  25. int x[MAXN],y[MAXN];
  26. LL M;
  27. set<pair<int,int> >s;
  28.  
  29. LL pow_mod(LL x,int cnt)
  30. {
  31. LL ret = ;
  32. while (cnt)
  33. {
  34. if (cnt & ) ret = ret * x % MOD;
  35. x = x * x % MOD;
  36. cnt >>= ;
  37. }
  38. return ret;
  39. }
  40.  
  41. void ext_gcd(LL a,LL b,LL &d,LL &x,LL &y)
  42. {
  43. if (b == ) {d = a; x = ; y = ;}
  44. else {ext_gcd(b,a % b,d,y,x); y -= x * (a / b);}
  45. }
  46.  
  47. LL inv(LL a,LL n)
  48. {
  49. LL d,x,y;
  50. ext_gcd(a,n,d,x,y);
  51. return d == ? (x + n) % n : -;
  52. }
  53.  
  54. LL log_mod(LL a,LL b,LL n)
  55. {
  56. LL m,v,e = ;
  57. m = (LL)sqrt(n + 0.5);
  58. v = inv(pow_mod(a,m),n);
  59. map<LL,LL>x;
  60. x[] = ;
  61. for (int i = ; i < m ; i++)
  62. {
  63. e = e * a % m;
  64. if (!x.count(e)) x[e] = (LL)i;
  65. }
  66. for (int i = ; i < m ; i++)
  67. {
  68. if (x.count(b)) return (LL)i * m + x[b];
  69. b = b * v % n;
  70. }
  71. return -;
  72. }
  73.  
  74. LL getnum()
  75. {
  76. int tot = ;
  77. for (int i = ; i <= B ; i++)
  78. {
  79. if (x[i] != M && !s.count(make_pair(x[i] + ,y[i]))) tot++;
  80. }
  81. tot += N;
  82. for (int i = ; i <= B ; i++) if (x[i] == ) tot--;
  83. return (pow_mod(K,tot) * pow_mod(K - ,(M * N - tot - B))) % MOD;
  84. }
  85.  
  86. LL calcu()
  87. {
  88. LL cnt = getnum();
  89. printf("%d\n",cnt);
  90. if (cnt == R) return M;
  91. int num = ;
  92. for (int i = ; i <= B ; i++) if (x[i] == M) num++;
  93. cnt = (cnt * pow_mod(K,num)) % MOD;
  94. cnt = (cnt * pow_mod(K - ,N - num)) % MOD;
  95. if (cnt == R)return M + ;
  96. //printf("%lld %lld\n",pow_mod(K - 1,N),pow_mod(K - 1,N));
  97. return log_mod(pow_mod(K - ,N),R * pow_mod(K - ,N),MOD) + M + ;
  98. }
  99. int main()
  100. {
  101. int T,kase = ;
  102. scanf("%d",&T);
  103. while (T--)
  104. {
  105. scanf("%lld%lld%lld%lld",&N,&K,&B,&R);
  106. R %= MOD;
  107. s.clear();
  108. M = ;
  109. for (int i = ; i <= B ; i++)
  110. {
  111. scanf("%d%d",&x[i],&y[i]);
  112. M = max(M,(LL)x[i]);
  113. s.insert(make_pair(x[i],y[i]));
  114. }
  115. printf("Case %d: %lld\n",kase++,calcu());
  116. }
  117. return ;
  118. }

POJ 2115 同青蛙的约会

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. LL gcd(LL a, LL b) {return a % b == ? b : gcd(b, a % b);}
  22. LL ext_gcd(LL a,LL b,LL &x,LL &y)
  23. {
  24. if (a == && b == ) return -;
  25. if (b == )
  26. {
  27. x = ;
  28. y = ;
  29. return a;
  30. }
  31. LL d = ext_gcd(b,a % b,y,x);
  32. y -= a / b * x;
  33. return d;
  34. }
  35. LL A,B,C,K;
  36.  
  37. int main()
  38. {
  39. while (scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&K) != EOF)
  40. {
  41. if (A == && B == && C == && K == ) break;
  42. LL a = C, b = (1LL << K), c = B - A;
  43. LL d = gcd(a,b);
  44. if (c % d != )
  45. {
  46. puts( "FOREVER" );
  47. continue;
  48. }
  49. a /= d;
  50. b /= d;
  51. LL x,y;
  52. ext_gcd(a,b,x,y);
  53. //cout << a << " " << b << " " << x << " " << y << endl;
  54. x *= c / d;
  55. y *= c / d;
  56. //cout << y << endl;
  57. //cout << x << endl;
  58. LL tmp = (1LL << K) / d;
  59. x = (x % tmp + tmp) % tmp;
  60. printf("%I64d\n",x);
  61. }
  62. return ;
  63. }

HDU 2161 Prime太水了。

UVA 11827 太水了

UVA 10200 太水了

SGU 106 The equation

判断欧几里德可行解在固定区间内的个数

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. LL gcd(LL a, LL b) {return a % b == ? b : gcd(b, a % b);}
  22. LL a,b,c,x1,x2,yy1,y2;
  23. LL x0,yy0;
  24. LL ext_gcd(LL a,LL b,LL &x,LL &y)
  25. {
  26. if (a == && b == ) return -;
  27. if (b == )
  28. {
  29. x = ;
  30. y = ;
  31. return a;
  32. }
  33. LL d = ext_gcd(b,a % b,y,x);
  34. y -= a / b * x;
  35. return d;
  36. }
  37.  
  38. int main()
  39. {
  40. while (scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&x1,&x2,&yy1,&y2) != EOF)
  41. {
  42. c = -c;
  43. if (c < )
  44. {
  45. a = -a;
  46. b = -b;
  47. c = -c;
  48. }
  49. if (a < )
  50. {
  51. a = -a;
  52. LL tmp = -x1;
  53. x1 = -x2;
  54. x2 = tmp;
  55. }
  56. if (b < )
  57. {
  58. b = -b;
  59. LL tmp = -yy1;
  60. yy1 = - y2;
  61. y2 = tmp;
  62. }
  63. if (a == && b == )
  64. {
  65. if (c == )
  66. {
  67. printf("%I64d\n",(x2 - x1 + ) * (y2 - yy1 + ));
  68. }
  69. printf("%d\n",);
  70. continue;
  71. }
  72. else if (a == )
  73. {
  74. if (c % b == )
  75. {
  76. if (c / b >= yy1 && c / b <= y2)
  77. {
  78. printf("%I64d\n",x2 - x1 + );
  79. }
  80. else printf("%d\n",);
  81. }
  82. continue;
  83. }
  84. else if (b == )
  85. {
  86. if (c % a == )
  87. {
  88. if (c / a >= x1 && c / a <= x2)
  89. {
  90. printf("%I64d\n",y2 - yy1 + );
  91. }
  92. printf("%d\n",);
  93. }
  94. continue;
  95. }
  96. LL d = gcd(a,b);
  97. if (c % d != )
  98. {
  99. puts("");
  100. continue;
  101. }
  102. a = a / d;
  103. b = b / d;
  104. c = c / d;
  105. ext_gcd(a,b,x0,yy0);
  106. x0 *= c;
  107. yy0 *= c;
  108. // printf("%I64d %I64d %I64d %I64d %I64d\n",a,b,c,x0,yy0);
  109. LL l1 = (LL)ceil((double)(x1 - x0) / (double)(b));
  110. LL l2 = (LL)ceil((double)(yy0 - y2) / (double)(a));
  111. LL r1 = (LL)floor((double)(x2 - x0) / (double)(b));
  112. LL r2 = (LL)floor((double)(yy0 - yy1) / (double)(a));
  113. // cout << l1 << " " << r1 << endl;
  114. // cout << l2 << " " << r2 << endl;
  115. LL l = max(l1,l2);
  116. LL r = min(r1,r2);
  117. if (l > r) puts("");
  118. else printf("%I64d\n",r - l + 1LL);
  119. }
  120. return ;
  121. }

POJ 2478 直接欧拉前N想和。

UVA 11752 The Super Powers

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <stack>
  8. #include <queue>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <string>
  12. #include <vector>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <iostream>
  17. #include <algorithm>
  18. #define LL unsigned long long
  19. #define PI 3.1415926535897932626
  20. using namespace std;
  21. int gcd(int a, int b) {return a % b == ? b : gcd(b, a % b);}
  22. set<LL>ans;
  23. set<LL>::iterator it;
  24. bool is_prime[];
  25.  
  26. void init()
  27. {
  28. for (int i = ; i < ; i++) is_prime[i] = true;
  29. is_prime[] = is_prime[] = true;
  30. for (int i = ; i < ; i++)
  31. {
  32. if (is_prime[i])
  33. {
  34. for (int j = i + i ; j < ; j += i)
  35. is_prime[j] = false;
  36. }
  37. }
  38. }
  39.  
  40. int main()
  41. {
  42. init();
  43. ans.clear();
  44. ans.insert();
  45. for (LL i = ; i < ( << ) ; i++)
  46. {
  47. LL limit = (LL)ceil(64.0 * log10(2.0) / log10(i));
  48. //cout << i << " " << limit << endl;
  49. // scanf("%*d");
  50. LL cur = ;
  51. for (int j = ; j < limit ; j++)
  52. {
  53. cur *= i;
  54. if (is_prime[j] == false)
  55. {
  56. ans.insert(cur);
  57. // cout << cur << endl;
  58. // scanf("%*d");
  59. }
  60. }
  61. }
  62. int cnt = ;
  63. for (it = ans.begin() ; it != ans.end() ; it++)
  64. cout << *it << endl;
  65. return ;
  66. }

kuangbin 带你飞 数学基础的更多相关文章

  1. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  2. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  3. Tarjan 联通图 Kuangbin 带你飞 联通图题目及部分联通图题目

    Tarjan算法就不说了 想学看这 https://www.byvoid.com/blog/scc-tarjan/ https://www.byvoid.com/blog/biconnect/ 下面是 ...

  4. 「kuangbin带你飞」专题十四 数论基础

    layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...

  5. 「kuangbin带你飞」专题二十 斜率DP

    layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathj ...

  6. 「kuangbin带你飞」专题二十二 区间DP

    layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...

  7. 「kuangbin带你飞」专题十九 矩阵

    layout: post title: 「kuangbin带你飞」专题十九 矩阵 author: "luowentaoaa" catalog: true tags: mathjax ...

  8. 「kuangbin带你飞」专题十八 后缀数组

    layout: post title: 「kuangbin带你飞」专题十八 后缀数组 author: "luowentaoaa" catalog: true tags: - kua ...

  9. 「kuangbin带你飞」专题十七 AC自动机

    layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - ku ...

随机推荐

  1. jmeter+ant的使用

    1.安装ant 下载ant,解压到某盘 2.配置环境变量: 变量名称 变量值 备注 ANT_HOME F:\apache-ant-1.10.3 Ant的解压路径 Path %ANT_HOME%\bin ...

  2. c#form界面情况下显示console窗体

    使用console.write()前后加上AllocConsole()和FreeConsole()方法. 注意:如果在使用之前有console输出(不带有这两个方法),则会无效. 这两个方法: [Dl ...

  3. ArcGIS API for JavaScript使用中出现的BUG(1)

    本人在使用ArcGIS API for JavaScript开发一个地图的搜索框时,总是出现一个BUG.如图所示: 搜索框总是出不来. 该引用的也引用了,找了半天终于解决,是因为路径没有定义详细. 应 ...

  4. PAT 1088 三人行

    https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 子曰:“三人行,必有我师焉.择其善者而从之 ...

  5. 解析LINQ To Object

    1.解剖Linq to object   此文转载自http://www.cnblogs.com/irenebbkiss/p/4155480.html LINQ想必大家都不陌生了,它 的出现使得我们的 ...

  6. spring MVC 字符串数组传值 字符带有逗号,问题

    按照如下图所示方式传值,想在后台得到一个长度为1的数组,后台直接根据,进行分割,就得到长度为2的数组 1.曲线救国解决法 解决方案, 前端对参数进行编码 encodeURIComponent(valu ...

  7. hdu6097 Mindis(几何)

    题解: 这里是用解析解的做法, 我们发现如果以P和Q做椭圆,那么当椭圆与圆相切的时候,答案最优 那么方程就是这样的 联立之后,解delta等于0,可以得到 答案就是2a了 注意不一定任何情况都有解,当 ...

  8. SICAU-OJ: A|B

    A|B 题意: 给出一个整数n(1<=n<=10100),求Σd(d满足d可以整除n),同时保证不存在x^2有x^2可以整除n. 另外,n的质因子满足小于等于1000. 题解: 这题是我第 ...

  9. Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean

    Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean. 工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一 ...

  10. javascript简易下拉菜单效果

    JS代码: window.onload=function(){ var oDiv=document.getElementById('navMenu'); var aUl=oDiv.getElement ...