hihocoder 1246 王胖浩与环
題意:
給出一個(gè)環(huán),環(huán)上有n(<=2000)個(gè)數(shù)字(<=5e7),然后將這個(gè)環(huán)分成1~n個(gè)連續(xù)序列,各個(gè)序列和之間的最大公因數(shù)。
?
題解:
我一開(kāi)始想到的是二分,然后對(duì)于二分就會(huì)想怎么check,那么可以枚舉這n個(gè)數(shù)和的因數(shù),因?yàn)榇鸢敢欢ㄔ谶@里面,然后就會(huì)找出對(duì)于每個(gè)因數(shù)可以分成的段數(shù),但是這個(gè)并不滿足單調(diào)性QAQ,但提供了一定的思路
考慮從大到小枚舉因數(shù),然后對(duì)于這個(gè)因數(shù)分成盡量多的部分,因?yàn)椴浑y知道如果a % x == 0,(a + b) % x == 0 那么b % x == 0,因?yàn)檫@樣就可以一直貪心找最大的因數(shù)。
然后現(xiàn)在的問(wèn)題就是考慮環(huán)的情況,一般的做法是斷環(huán)為鏈,枚舉起點(diǎn)到終點(diǎn)找出有多少段%x == 0,但是可以稍微變一下形,如果pre[i] % x == y, pre[j] % x == y,那么i ~ j這一段%x為0,那么(1 ~ i) + (j+1 ~ n) % x == 0,那么現(xiàn)在的問(wèn)題就是統(tǒng)計(jì)余數(shù)出現(xiàn)最多的次數(shù),就完美處理了環(huán)的情況。
?
代碼:
?
#include <bits/stdc++.h> using namespace std;const int N = 4e3 + 7; #define LL long long vector <LL> num; int n; LL pre[N];int main () {scanf ("%d", &n);for (int i = 1; i <= n; ++i) {int x;scanf ("%d", &x);pre[i] = pre[i-1] + x;}for (LL i = 1; i * i <= pre[n]; ++i) {if (pre[n] % i == 0) {if (i * i == pre[n]) {num.push_back(i);continue;}num.push_back(i);num.push_back(pre[n] / i);}}sort (num.begin(), num.end());int K = 1;for (int i = num.size() - 1; i >= 0; --i) {int maxi = 0;vector <LL> v;for (int j = 1; j <= n; ++j) v.push_back(pre[j] % num[i]);sort (v.begin(), v.end());int pre = 0;for (int j = 0; j < v.size(); ++j) {if (v[j] == v[j+1] && j != v.size()-1) continue;maxi = max (maxi, j - pre + 1);pre = j + 1;}while (K <= maxi) {printf ("%lld\n", num[i]);++K;}}return 0; }
總結(jié):
這種求因數(shù)的題,并且數(shù)的范圍不大,可以直接暴力枚舉因數(shù)。。。。。。還有注意的是公式的變換~
轉(zhuǎn)載于:https://www.cnblogs.com/xgtao/p/6014657.html
總結(jié)
以上是生活随笔為你收集整理的hihocoder 1246 王胖浩与环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php基础 快速入门文档,快速入门 -
- 下一篇: 论文阅读: (ICDAR2021 海康威