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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数列互质问题。

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数列互质问题。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


題目大意:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

給出一個數列,要求選出若干個數,這些數可以相鄰也可以不相鄰,這些數滿足相鄰的兩個數不能互質,求最多有多少個數滿足要求。【數列中1的情況是存在的】。數據范圍:n<=100000,數列中的數<=100000

例如:給出6個數的數列:6,2,3,15,8,5,那么滿足要求的解就是4,即6,3,15,5

解題思路:

首先用到了分解質因數:

樸素的分解質因數代碼如下:【From?百度百科】

應該很好理解。

1 var
2 n,i:longint;
3 begin
4 readln(n);
5 write(n,'=1');
6 i:=2;
7 while i<=n do begin
8 while n mod i=0 do begin
9 write('*',i);
10 n:=n div i;
11 end;
12 inc(i);
13 end;
14 end.

題目給出的數據范圍為100000,我們用篩法求出100000以內的質數。

從前往后掃過數列,對于當前處理的數,當前位的前一個相鄰的數一定與它不互質,也就是說如果想要求到當前位滿足要求的最長序列,它的上一位一定是離它最近的且有公共質因子的數,由這個最近的數的長度+1來更新當前數位的長度。

設w[j]表示當前質因數能夠整除前面數中的最后一個的位數。F[i]表示i位數滿足要求的最長長度。其中第j個質數必須能夠整除數列中第i個數。

樣例的模擬過程:

數列:6?2?3?15?8?5

質數:2?3?5?7?11?13……

1.處理數列中第一個數6.不大于6的質數有2,3,都是6的質因數,由于在6的前面沒有跟6的公共質因子為2或3的數,故更新f[1]:=1;w[1]:=1;w[2]:=1;【注意w[j]表示的是第j個質數】

2.處理數列中第二個數2,不大于2的質數有2,是2的質因數。2是第1個質數,w[1]=1,找到數列中的第一個數6,由f[1]來更新f[2],所以f[2]=f[1]+1=2

3.以此類推……

求出了數列中所有數的最長序列長度,最后總的掃描一遍求最大值即可。

代碼如下:

1 var
2 i,j,k,n,m:longint;
3 zhi,g,a,w:array[0..100001] of longint;
4 v:array[0..100001] of boolean;
5 sum,ans,tmp:longint;
6 procedure init;
7 begin
8 readln(n);
9 for i:=1 to n do
10 read(a[i]);
11 end;
12 procedure main;
13 begin
14 fillchar(v,sizeof(v),true);
15 for i:=2 to 50000 do
16 begin
17 j:=2;
18 while i*j<=100000 do
19 begin
20 v[i*j]:=false;
21 j:=j+1;
22 end;
23 end;
24 sum:=0;
25 for i:=2 to 100000 do
26 if v[i] then
27 begin
28 inc(sum);
29 zhi[sum]:=i;
30 end;
31 fillchar(g,sizeof(g),0);
32 for i:=1 to n do
33 if a[i]<>1 then
34 begin
35 for j:=1 to sum do
36 begin
37 if zhi[j]>a[i] then break;
38 if a[i] mod zhi[j]=0 then
39 begin
40 if g[w[j]]+1>g[i] then g[i]:=g[w[j]]+1;
41 w[j]:=i;
42 end;
43 end;
44 end;
45 ans:=0;
46 for i:=1 to n do
47 if g[i]>ans then ans:=g[i];
48 writeln(ans);
49 end;
50 begin
51 assign(input,'tree.in');reset(input);
52 assign(output,'tree.out');rewrite(output);
53 init;
54 main;
55 close(input);
56 close(output);
57 end.

Viaky原創。請勿copy。

轉載于:https://www.cnblogs.com/Viaky/archive/2011/08/11/2135396.html

總結

以上是生活随笔為你收集整理的数列互质问题。的全部內容,希望文章能夠幫你解決所遇到的問題。

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