LightOJ1220謎の細菌の素因数分解

LightOJ1220 謎の細菌

タグ

  • の素因数分解

序文

質問の簡潔な意味

  • 与えられたN、見つける(A ^ K = \ n)が \ 、最大K

考え

  • 直接、nの素因数分解に。Min_cは最小cと定義しました。すべてのC持っている(分\ _c | C \ \を ) 時間、cが答えです。そうでなければ、答えは1です。
  • nが負になることがあるのでしかし、そのような考慮は、包括的ではありません!今回はそれを特別審査員を必要とします。それが否定的であれば、依然として上記のステップは、答えはmin_c最大の奇数の係数です。そして、最大の奇数の要因は、直接に分けるいないに加えて、常に/ 2をmin_c。

    その上に分割しないように加えて、常に/ 2をmin_cしてみましょう。ここについての話理由です。2素数は彼の他の素因数が乗算される考慮せずに素因数分解min_c、2以外の奇数である、生成物(奇数による奇数まだ奇数である)奇数でなければなりません。素因数2 min_c製品が最大奇数係数をmin_c除去された後に他のように素因数。

注意事項

  • ノー

概要

  • 最大の奇数倍探している:2個の素因数を削除し、他の定性的な要因は、いつものように掛けている答えです。

ACコード

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn = 1e5 + 10;

bool no_prime[maxn];
int prime[maxn];
int shai(int n)
{
    int cnt = 0;
    no_prime[1] = 1;

    for (int i = 2; i <= n; i++)
    {
        if (!no_prime[i])
            prime[++cnt] = i;

        for (int j = 1; j <= cnt && prime[j] * i <= n; j++)
        {
            no_prime[prime[j] * i] = 1;
            if (i % prime[j] == 0) break;
        }
    }
    return cnt;
}

void solve()
{
    int cnt = shai(maxn - 10);

    int t;
    scanf("%d", &t);
    for (int i = 1; i <= t; i++)
    {
        long long n, r;
        scanf("%lld", &n);
        r = n;      
        n = abs(n);
        

        int flag = 1;

        int x_cnt = -1;
        for (int i = 1; 1ll * prime[i] * prime[i] <= abs(r) && n != 1; i++)
        {
            int cnt = 0;
            while (n % prime[i] == 0)
                n /= prime[i], cnt++;
            if (x_cnt == -1 && cnt != 0)
                x_cnt = cnt;

            

            if (cnt != 0 && !(x_cnt % cnt == 0 || cnt % x_cnt == 0) )
            {
                flag = 0;
                break;
            }

            if (x_cnt != -1 && cnt != 0)
            {
                x_cnt = min(x_cnt, cnt);
            }
        }
        if (n != 1 && n != x_cnt)
            flag = 0;
        if (r < 0 && x_cnt % 2 == 0)
        {
            while (x_cnt % 2 == 0)
                x_cnt /= 2;
        }
        if (x_cnt == -1) x_cnt = 1;

        if (flag)
            printf("Case %d: %d\n", i, x_cnt);
        else
            printf("Case %d: 1\n", i);
    }
}

int main()
{
    freopen("Testin.txt", "r", stdin);
    solve();
    return 0;
}

おすすめ

転載: www.cnblogs.com/danzh/p/11420963.html