• 【CODECHEF】【phollard rho + miller_rabin】The First Cube


    All submissions for this problem are available.

    Read problems statements in Mandarin Chinese and Russian.

    This problem's statement is really a short one.

    You are given an integer S. Consider an infinite sequence S, 2S, 3S, ... . Find the first number in this sequence that can be represented as Q3, where Q is some positive integer number. As the sought number could be very large, please print modulo (109 + 7).

    The number S will be given to you as a product of N positive integer numbers A1, A2, ..., AN, namely S = A1 * A2 * ... * AN

    Input

    The first line of the input contains an integer T denoting the number of test cases. The description of T test cases follows.

    The first line of each test case contains an integer N.

    Then there is a line, containing N space separated integers, denoting the numbers A1, A2, ..., AN.

    Output

    For each test case, output a single line containing the first term of the sequence which is the perfect cube, modulo 109+7.

    Constraints

    • 1T10
    • (Subtask 1): N = 1, 1S109 - 15 points.
    • (Subtask 2): N = 1, 1S1018 - 31 point.
    • (Subtask 3): 1N100, 1Ai1018 - 54 points.

    Example

    Input:
    2
    2
    2 2
    2
    2 3
    Output:
    8
    216
    

    Explanation

    Example case 1. First few numbers in the infinite sequence 4, 8, 12, 16, 20, , etc. In this sequence, 8 is the first number which is also a cube (as 23 = 8).

    Example case 2. First few numbers in the infinite sequence 6, 12, 18, 24, , etc. In this sequence, 216 is the first number which is also a cube (as 63 = 216).

    【分析】

    挺模板的东西,就当复习一下了。

      1 /*
      2 宋代李冠
      3 《蝶恋花·春暮》
      4 遥夜亭皋闲信步。
      5 才过清明,渐觉伤春暮。
      6 数点雨声风约住。朦胧淡月云来去。
      7 桃杏依稀香暗渡。
      8 谁在秋千,笑里轻轻语。
      9 一寸相思千万绪。人间没个安排处。 
     10 */
     11 #include <cstdio>
     12 #include <cstring>
     13 #include <algorithm>
     14 #include <cmath>
     15 #include <queue>
     16 #include <vector>
     17 #include <iostream>
     18 #include <string>
     19 #include <ctime>
     20 #include <map>
     21 #define LOCAL
     22 const int MAXN = 105 + 10;
     23 const long long MOD = 1000000007;
     24 const double Pi = acos(-1.0);
     25 long long G = 15;//原根 
     26 const int MAXM = 60 * 2 + 10; 
     27 using namespace std;
     28 typedef long long ll;
     29 ll read(){
     30    ll flag = 1, x = 0;
     31    char ch;
     32    ch = getchar();
     33    while (ch < '1' || ch > '9') {if (ch == '-') flag = -1; ch = getchar();}
     34    while (ch >= '0' && ch <= '9') {x = x * 10 + (ch - '0'); ch = getchar();}
     35    return x * flag;
     36 }
     37 map<ll, int>Num;//记录个数
     38 ll data[MAXN]; 
     39 ll n;
     40 
     41 ll mul(ll a, ll b, ll c){//又要用快速乘QAQ
     42    if (b == 0) return 0ll;
     43    if (b == 1) return a % c;
     44    ll tmp = mul(a, b / 2, c);
     45    if (b % 2 == 0) return (tmp + tmp) % c;
     46    else return (((tmp + tmp) % c) + (a % c)) % c;
     47 }
     48 ll pow(ll a, ll b, ll c){
     49    if (b == 0) return 1ll;
     50    if (b == 1) return a % c;
     51    ll tmp = pow(a, b / 2, c);
     52    if (b % 2 == 0) return mul(tmp, tmp, c);
     53    else return mul(mul(tmp, tmp, c), a, c);
     54 }
     55 bool Sec_check(ll a, ll b, ll c){
     56      ll tmp = pow(a, b, c);
     57      if (tmp != 1 && tmp != (c - 1)) return 0;
     58      if (tmp == (c - 1) || (b % 2 != 0)) return 1; 
     59      return Sec_check(a, b / 2, c);
     60 }
     61 //判断n是否是素数 
     62 bool miller_rabin(ll n){
     63      int cnt = 20;
     64      while (cnt--){
     65            ll a = (ll)rand() % (n - 1) + 1;
     66            if (!Sec_check(a, n - 1, n)) return 0;
     67      } 
     68      return 1;
     69 }
     70 ll gcd(ll a, ll b){return b == 0ll ? a : gcd(b, a % b);}
     71 ll pollard_rho(ll a, ll c){
     72    ll i = 1, k = 2;
     73    ll x, y, d;
     74    x = (ll)((double)(rand() / RAND_MAX) * (a - 2) + 0.5) + 1ll; 
     75    y = x;
     76    while (1){
     77          i++;
     78          x = (mul(x, x, a) % a + c) % a;
     79          d = gcd(y - x + a, a);
     80          if (d > 1 && d < a) return d;
     81          if (y == x) return a;//失败
     82          if (i == k){
     83             k <<= 1;
     84             y = x;
     85          }
     86    }
     87 }
     88 void find(ll a, ll c){
     89      if (a == 1) return;
     90      if (miller_rabin(a)){
     91         Num[a]++;
     92         return;
     93      }
     94      ll p = a;
     95      while (p >= a) pollard_rho(a, c--);
     96      pollard_rho(p, c);
     97      pollard_rho(a / p, c);
     98 }
     99 void init(){
    100      Num.clear();
    101      scanf("%d", &n);
    102      for (int i = 1; i <= n; i++) {
    103          data[i] = read();
    104          find(data[i], 15000);
    105      }
    106 } 
    107 void work(){
    108      ll Ans = 1;
    109      for (int i = 1; i <= n; i++) Ans = (Ans * data[i]) % MOD;
    110      for (map<ll, int>::iterator it = Num.begin(); it != Num.end(); it++){
    111          it->second %= 3;
    112          if (it->second){
    113             for (int i = it->second; i < 3; i++) Ans = (Ans * ((it->first) % MOD)) % MOD;
    114          }
    115      }
    116      printf("%lld
    ", Ans);
    117 }
    118 
    119 int main(){
    120     int T;
    121     
    122     scanf("%d", &T);
    123     while (T--){
    124           init();
    125           work();
    126     }
    127     return 0;
    128 }
    View Code
  • 相关阅读:
    MethodNotAllowedHttpException
    laravel项目return back()->withErrors($validator)或return back()->with('errors','原密码错误!')在前台原密码错误的情况下不能正确显示错误信息,变成报错!
    laravel加入验证码类几种方法 && Laravel引入第三方库的方法
    使用Git命令从Github下载代码仓库
    4-ESP8266 SDK开发基础入门篇--串口
    2-STM32+W5500+GPRS物联网开发基础篇-基础篇学习的内容
    3-ESP8266 SDK开发基础入门篇--点亮一个灯
    2-ESP8266 SDK开发基础入门篇--非RTOS版与RTOS版
    1-ESP8266 SDK开发基础入门篇--开发环境搭建
    11-网页,网站,微信公众号基础入门(配置自己的微信公众号,添加一个按钮)
  • 原文地址:https://www.cnblogs.com/hoskey/p/4382063.html
Copyright © 2020-2023  润新知