リンクします。https://ac.nowcoder.com/acm/contest/3002/Eの
対象の説明
RIN最近気に入って数論。
しかし、数論があまりにも複雑であり、彼女は唯一のいくつかの簡単な質問を勉強できます。
その日は、彼女が要因の正の整数を研究するとき「高速反復」アルゴリズムの考え。提供F(x)は、xの数、f(x)がダウン繰り返し、りん推測最終的になる任意の正の整数倍です。
例えば:F(12)= 6、 F(6)= 4、F(4)= 3、F(3)= 2。
彼女はあなたがテストに彼女を助けるために望んでいます。彼女は反復2に、反復プロセスで、あなたが出力にそれを聞かせて、あなたの最初の反復を正の整数nを与えるでしょう。
入力説明:
正の整数N(3 <= N <= 10 ^ 12)
の出力説明:
正の整数、nは反復の数が2です。
例えば
入力
12
出力
4は、
記載
12の要因:1,2,3,4,6,12。6の合計。
ファクター6:1,2,3,6-。4の合計。
ファクター4:2,4。3の合計。
要因3:1,3。2の合計。
→12→6→4→3 2、 それが4回繰り返されます。
取り扱い
素因数分解定理に
数をn個肯定的に分解することができる数は確実に素数と合成数からなる複合数が素数に分解することができているとの調和の数、最終製品は、再帰素数になりますので。実施例36 - > 2 2 3 * 3 - > 3 ^ 2 ^ 2 * 2
最後に素数でなる逓倍形。
前記(2)は等比級数の総和式の使用は、以下のように簡略化することができます。
この問題は、数式を適用することができる:N因子=(1 + A1)(1 + A2)...(1 +)の数であります
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <math.h>
#include <map>
using namespace std;
typedef long long ll;
ll cnt(ll n) //求 n 的因子个数
{
ll i, ans = 1, a;
for(i = 2; i*i <= n; i++)
{
if(n%i == 0)
{
a = 0;
while(n%i == 0)
{
n /= i;
a++;
}
ans *= (a+1);
}
}
if(n > 1)
ans *= 2;
return ans;
}
int main()
{
ll n, i, tmp;
while(~scanf("%lld", &n))
{
tmp = cnt(n);
i = 1;
while(tmp != 2)
{
tmp = cnt(tmp);
i++;
}
printf("%lld\n", i);
}
return 0;
}
、最終的には、そこをn == 1なければならないことをプロセスの途中で出力を確認して、「(N> 1)はANS場合* = 2」なぜ最初にコードCNT()偉大な神は、どのような魔法の書き込みを参照する機能、およびは理解していませんビット(以下に示すように)とないああことを発見しました。例えば、2 ^ 520 = 3 * 5 * 13 ^ 1 ^ 1、そうプライム層13のループ、N%は、I == 0インデックスが見つからないことを、図13は、最終的な乗算に入ります
当然のことながら、機能の一部が主に直接であってもよい()、Aとwhileループ
int main()
{
ll n, i, ans, a;
int cnt;
while(~scanf("%lld", &n))
{
cnt = 0;
while(n != 2)
{
cnt++;
ans = 1;
for(i = 2; i*i <= n; i++)
{
if(n%i == 0)
{
a = 0;
while(n%i == 0)
{
n /= i;
a++;
}
ans *= (a+1);
}
}
if(n > 1)
ans *= 2;
n = ans;
}
printf("%d\n", cnt);
}
return 0;
}
次いで、因子の数も求めることができます
ll cnt(ll n)
{
ll i, ans;
ans = 0;
for(i = 1; i*i <= n; i++)
if(n%i == 0)
ans += 2;
i--;
if(i*i == n)
ans--;
return ans;
}
明らかに、これは擬似オリジナル、マルチ参照記事ですが、侵害あれば、問題は(彼の背後にある)オリジナルキャストで再現されると言うことはできません、速やかに接触