例題:codeforces 1325e
1. 題目解釋每個數的因數個數不超過7個,說明了每個數最多只有2個質因數,因為如果有3個質因數的話,那麼 f(n)=(1+1)^3=8>7不成立了。
2. 求出的答案要使得乘積為完全平方,因此答案的質因數個數必須為偶數個,即a1、a2……要為偶數。
3. 答案的質因數個數必須為偶數個,等價於選最少的數,使乘積包含的質因子冪次都為 2。如果乙個數本身的質因數個數都為偶數,則直接輸出1即可,如果沒有這樣的數,我們可以考慮嘗試把每個數的質因數湊在一起,使得質因數個數都為偶數,這樣也可以求出答案,如果連湊都湊不出來,則輸出-1.
4. 考慮嘗試把每個數湊起來的方法比較巧妙,我們建立乙個無向圖,每個點代表了乙個質因子,如果某個數有兩個獨立的質因子,也就是說只有這兩個質因數湊不了偶數,那麼我們就把這兩個數連一條邊,說明這兩個數的個數都為1(入度為1),這有什麼用呢?考慮無向圖的性質,如果每個點的入度為 2,所以邊對應的數的乘積每個質因子冪次都為 2,這就要讓我們找出無向圖中所存在的最小環。
這題數論與圖論的結合十分巧妙,所以我們要有充足的前備知識才能做得出這道題目。
#include #define mp make_pairview codeusing
namespace
std;
typedef
long
long
ll;inline
int read()
while(ch>='
0'&&ch<='
9') s=s*10+ch-'
0',ch=getchar();
return s*w;}
const
int maxn = 1000005
;const
int inf = 0x3f3f3f3f
;int
ip[maxn],i,n,p[maxn],cnt,dis[maxn],a[maxn],ans;
bool
vis[maxn];
vector
g[maxn];
void
get_prime()
for (int j=1;j<=cnt && i*p[j]<=maxn;j++)
}}void add(int x,int
y)void div(int
x) }
}if (x>1
)
if (num==0) puts("
1"),exit(0
);
else
if(num==1) add(1,div[1
]);
else add(div[1],div[2
]);}
int bfs(int
x) q.pop();
}return
inf;
}int
main()
ans=inf;
for (i=1;i<=1000;i++)
if (ans==inf) cout<
<
else cout
return0;
}
7'>7
數論 約數個數
這題是個大水題,只不過資料稍微大了點。結果大家都用那啥的模擬。結果哈哈哈哈哈哈。求a b之間每個數的約數個數的總和。input 一行兩個正整數a b,以乙個空格隔開。output 一行乙個整數,即答案。資料範圍 對於50 的資料,1 a b 1000 對於100 的資料,1 a b 10,000,0...
約數個數定理
編輯 對於乙個大於1正整數n可以 分解質因數 則n的 正約數的個數就是 其中a 1 a2 a 3 ak是p 1 p2 p 3,p k的指數。編輯首先同上,n可以 分解質因數 n p1 a1 p2 a2 p3 a3 pk ak,由約數定義可知p1 a1的約數有 p1 0,p1 1,p1 2.p1 a1...
約數個數定理and約數和定理
定理 對於乙個大於1正整數n可以 分解質因數 則n的正約數 的個數就是 證明 省略 舉個栗子 例題 正整數378000共有多少個 正約數?解 將378000 分解質因數378000 2 4 3 3 5 3 7 1 由約數個數定理可知378000共有正約數 4 1 3 1 3 1 1 1 160個。c...