問題の意味:n個の除数番号を見つけます
アプローチ:XはN数の最大公約数であることを考えると、X Tは、素数に分解することができる216 = 3×2 ^ 3 ^ 3、数約4×4 216のいくつか
書式#include <stdio.hに> する#include < 文字列の.h> の#include <リスト> の#include <アルゴリズム> 使用して 名前空間はstdを、 typedefの長い 長いLL。 typedefをダブルデシベル。 const int型 maxsz = 10001 ; const int型 MAXN = 4E5 + 1 ; // int型CNT [maxsz]。 LL [MAXN]。 BOOL isprime(LLのNUM){ 場合(NUMの== 1)を返す 偽。 用(LL I = 2; 私は、私を* <= NUM; 私は++ ) 場合(NUM%は私が== 0)を返す 偽。 返す 真; } int型のmain(){ int型のT。 LLのn; scanf関数(" %のD "、&T)。 用(int型 I = 1のscanf(; I <= T I ++)は、 " %のLLD "、A + I)。 N = [ 1 ]。 以下のために(int型 I = 2 ; I <= T; iは++)N = __gcd(N、[I])。 LL ANS = 1 。 以下のために(LL I = 2 ; iは、* I <= N; iは++ ){ LLのCNT = 1 。 もし(isprime(I)){ 一方(N%I == 0 ){ N / = I。 CNT ++ ; } } ANS = ANS * CNT。 } もし、(N - 1)* ANS = 2 。 printf(" %LLDする\ n " 、ANS)。 リターン 0; }