日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NOI / 2.5基本算法之搜索7834:分成互质组(详细讲解)

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NOI / 2.5基本算法之搜索7834:分成互质组(详细讲解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總時間限制:?1000ms????????????????????????????????????????內存限制:?65536kB

描述

給定n個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?

輸入

第一行是一個正整數n。1 <= n <= 10。
第二行是n個不大于10000的正整數。

輸出

一個正整數,即最少需要的組數。

樣例輸入

6 14 20 33 117 143 175

樣例輸出?

3

來源

2008年第十三屆“華羅庚金杯”少年數學邀請賽 決賽第5題

查看? ? ? ? ??提交? ? ? ? ??統計? ? ? ? ??提問

———————————————————————————————————————————

開始講解

首先,觀察題目,要把輸入的幾個數分成幾組數,要求每一組數中任意兩個數互質,求最少需要分成幾組。

要判斷是否互質,我們需要定義一個計算最大公因數的遞歸調用函數,返回最大公因數,只需要判斷最大公因數是否是1就可以了(互質就表示最大公因數是1)。

int fun(int a,int b) {if(b==0)return a;elsereturn fun(b,a%b); }

其中a,b表示需要判斷的兩個數(上面用的是輾轉相除法)。

然后繼續觀察題目,要求每組數中兩兩互質,怎么判斷兩兩互質呢,其實并不復雜,只需要用新數去與原來那組數所有數的乘積去判斷就可以了。

最后想法:首先遍歷每個數,判斷每個數是否用過(定義一個狀態數組),初值為0,表示沒有用過),如果沒有用過,組數加一,更改狀態數組的值(0改為1),從這個數的后面每個數開始遍歷,如果當前判斷的這個數沒有用過,且與一開始的數互質,把這個數乘到原來的數里面去(a[i]*=a[j]),把后來的數表示用過。最后輸出組數的數量就行了。

最終代碼

#include<bits/stdc++.h> using namespace std; int fun(int a,int b) {if(b==0)//余數為0。return a;//返回除數。elsereturn fun(b,a%b);//返回除數和余數。 } int main() {int a[12],v[12]={0},i,j,t=0,n;cin>>n;for(i=1;i<=n;i++)cin>>a[i];//保存輸入的數。for(i=1;i<=n;i++)//遍歷a數組(此處需要循環到最后一個數,因為最后一個數如果是單獨一個\數的話,也要開新的一組,如果循環到n-1,就漏了一組。)。if(v[i]==0)//如果當前的數沒有用過。{t++;//新的一組。v[i]=1;//標記用過。for(j=i+1;j<=n;j++)//找到與他同一組的數if(v[j]==0&&fun(a[i],a[j])==1)//如果沒用過且與其他數互質。{a[i]*=a[j];//將同一組的乘積存入a[i]v[j]=1;//標記用過。}}cout<<t<<endl;//輸出一共有幾組數return 0; }

創作不易,給個點贊、收藏、關注、支持支持唄。(*^▽^*)? ?(?ω?)

總結

以上是生活随笔為你收集整理的NOI / 2.5基本算法之搜索7834:分成互质组(详细讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。