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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hihoCoder #1246 : 王胖浩与环 (数学)

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hihoCoder #1246 : 王胖浩与环 (数学) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

題意:

  有一個環形序列,可以將其切成連續的k段子序列,那么gcd( 每段子序列的和 )就是優美程度。輸出n個整數,表示當k=[1, n] 時的最大優美程度。?

?

思路:

  觀察一下,當切成1段的時候,gcd就是sum[整個序列],為最大。考慮切成2段,那么最好就是能讓這個環切成2段和為sum[整個序列]/2的子序列了。考慮切成3段,那么最好就是能讓這個環切成3段和為sum[整個序列]/3的子序列了。繼續下去,這不就是求sum[整個序列]的約數嗎?

  假設約數有k個,從大到小分別為factor[1~R]。那么其中有些因數是可能組不成的,得去掉那些組不成的。假設sum[整個序列]最多能切成cnt段和為factor[t]的連續子序列,那么段數i<=cnt的,答案都是factor[t]了,取最大即可。

  問題在于如何求出切成長為factor[t]的最多段數cnt[t]?當前綴和pre%factor=r出現了m次時應該是這樣的: ..|xxxx|xxxx|......|xxx|xxxx|.. (共有m個切口|),觀察到除了首尾之外,其他每段都是d的倍數,且首尾之和也是d的倍數(因為sum[整個序列]=k*d)。那么對于factor[t],只需要枚舉r來求出最大的m即可。

?

?

1 #include<bits/stdc++.h> 2 #define pii pair<int,int> 3 #define INF 0x3f3f3f3f 4 #define LL long long 5 using namespace std; 6 const int N=2010; 7 vector<LL> factor, cnt; 8 LL a[N]; 9 map<LL,LL> mapp; 10 int main() 11 { 12 freopen("input.txt","r",stdin); 13 int n; 14 while(~scanf("%d",&n)) 15 { 16 for(int i=1; i<=n; i++) 17 { 18 scanf("%lld",&a[i]); 19 a[i]+=a[i-1]; 20 } 21 for(LL i=1; i*i<=a[n]; i++) 22 { 23 if(a[n]%i==0) 24 { 25 factor.push_back(a[n]/i); 26 factor.push_back(i);//多一個也不影響結果 27 } 28 } 29 sort(factor.begin(),factor.end()); 30 deque<LL> ans; 31 for(int k=factor.size()-1,i=1; k>=0; k--) 32 { 33 LL big=0, c=factor[k]; 34 mapp.clear(); 35 for(int j=1; j<=n; j++) 36 big=max(big,++mapp[a[j]%c]); 37 while(i<=n&&big>=i) 38 { 39 ans.push_back(c); 40 i++; 41 } 42 } 43 while(!ans.empty()) 44 { 45 printf("%lld\n",ans.front()); 46 ans.pop_front(); 47 } 48 } 49 return 0; 50 } AC代碼

?

轉載于:https://www.cnblogs.com/xcw0754/p/4930073.html

總結

以上是生活随笔為你收集整理的hihoCoder #1246 : 王胖浩与环 (数学)的全部內容,希望文章能夠幫你解決所遇到的問題。

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