NOIP2009普及组细胞分裂(数论)——yhx
Hanks 博士是 BT (Bio-Tech,生物技術) 領域的知名專家。現在,他正在為一個細胞實
驗做準備工作:培養細胞樣本。
Hanks 博士手里現在有 N 種細胞,編號從 1~N,一個第 i 種細胞經過 1 秒鐘可以分裂為
Si個同種細胞(Si為正整數)。現在他需要選取某種細胞的一個放進培養皿,讓其自由分裂,
進行培養。一段時間以后,再把培養皿中的所有細胞平均分入 M 個試管,形成 M 份樣本,
用于實驗。Hanks 博士的試管數 M 很大,普通的計算機的基本數據類型無法存儲這樣大的
M 值,但萬幸的是,M 總可以表示為 m1的 m2次方,即
M = m1^m2
,其中 m1,m2均為基本
數據類型可以存儲的正整數。
注意,整個實驗過程中不允許分割單個細胞,比如某個時刻若培養皿中有 4 個細胞,
Hanks 博士可以把它們分入 2 個試管,每試管內 2 個,然后開始實驗。但如果培養皿中有 5
個細胞,博士就無法將它們均分入 2 個試管。此時,博士就只能等待一段時間,讓細胞們繼
續分裂,使得其個數可以均分,或是干脆改換另一種細胞培養。
為了能讓實驗盡早開始,Hanks 博士在選定一種細胞開始培養后,總是在得到的細胞“剛
好可以平均分入 M 個試管”時停止細胞培養并開始實驗。現在博士希望知道,選擇哪種細
胞培養,可以使得實驗的開始時間最早。
輸入輸出格式
輸入格式:
第一行有一個正整數 N,代表細胞種數。
第二行有兩個正整數 m1,m2,以一個空格隔開,
即表示試管的總數 M = m1^m2。
第三行有 N 個正整數,第 i 個數 Si表示第 i 種細胞經過 1 秒鐘可以分裂成同種細胞的個
數。
輸出格式:
輸出文件 cell.out 共一行,為一個整數,表示從開始培養細胞到實驗能夠開始所經過的
最少時間(單位為秒)。
如果無論 Hanks 博士選擇哪種細胞都不能滿足要求,則輸出整數-1。
1 #include<cstdio> 2 #include<cmath> 3 struct prm 4 { 5 int x,t; 6 }m[10010]; 7 int a[10010]; 8 int main() 9 { 10 int i,j,k,n,p,q,m1,m2,x,y,z,cntm,ans,t; 11 bool ok; 12 scanf("%d",&n); 13 scanf("%d%d",&m1,&m2); 14 cntm=0; 15 for (i=2;m1!=1;i++) 16 if (m1%i==0) 17 { 18 cntm++; 19 m[cntm].x=i; 20 while (m1%i==0) 21 { 22 m[cntm].t++; 23 m1/=i; 24 } 25 m[cntm].t*=m2; 26 } 27 ans=-1; 28 for (i=1;i<=n;i++) 29 scanf("%d",&a[i]); 30 for (i=1;i<=n;i++) 31 { 32 p=0; 33 ok=1; 34 for (j=1;j<=cntm;j++) 35 if (a[i]%m[j].x==0) 36 { 37 t=0; 38 while (a[i]%m[j].x==0) 39 { 40 a[i]/=m[j].x; 41 t++; 42 } 43 if (m[j].t%t==0) t=m[j].t/t; 44 else t=m[j].t/t+1; 45 if (t>p) p=t; 46 } 47 else 48 { 49 ok=0; 50 break; 51 } 52 if (ok&&(ans==-1||p<ans)) ans=p; 53 } 54 printf("%d\n",ans); 55 }題目可以轉化成求方程ax=km1m2(k為整數)的最小整數解。【我也來試一試打公式】
先把m1質因數分解,再把每個次數都乘上m2就是題中的M質因數分解的結果。
方程如果有解,那么必須m1的每個因數都是a的因數,這樣a經過冪之后才可能成為m1的倍數。在此基礎上,取各個因數中次數相差最多(指的是倍數)的一個的倍數,就是x的最小值。
轉載于:https://www.cnblogs.com/SBSOI/p/5574996.html
總結
以上是生活随笔為你收集整理的NOIP2009普及组细胞分裂(数论)——yhx的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RHEL7.0 配置网络IP的三种方法
- 下一篇: Builder Pattern 在 Ob