分割范围Codeforces Round #181 (Div. 2)
每日一贴,今天的内容关键字为分割范围
A ,B虽然是水题,但要是没想清晰就易容掉进某个坑里。。
C:预处理出有所可能的和,然后个每个每和分给a b两个数
D:竞赛的时候标题没看懂,题意就是说在一个n*n的正方形格网中分割k次有几种分法,每次分完后剩下的四个子矩形必须为正方形。斟酌到最后可以分割log级别的次数,而且每分割一次,又现出了四个空白的子正方形,天然以可就想到dp,很明显的子结构啊。我们不妨从小到大结构,每多一层,正方形的巨细就扩展两倍,dp[i][j]示表前i层,经已画了k次的总案方数,那么转移的时候我们只需要枚举以后层的四个角落各自画了多少次,然后酿成一个两倍巨细的正放形(多画一步)。天然不能四重循环去枚举,间中要套一个的d【】组数来多进行一次小DP,算是DP套着DP吧。
E:求满意p!%(a1!*a2!*a3!*...*ak!)=0;的最小的p。k的范围是100w,a[i]的范围是1000w.
没什么难想的,就是考你有没有把握什么速快解分质因子的法方。。。。
学了一种欧拉法筛,,可以在线性时间内筛选出素数,还可以失掉个每数的最小质因子lp[i]。
http://wenku.baidu.com/view/542961fdba0d4a7302763ad5.html
O(n)明证的关键是个每数只会被筛一次
然后接下来的问题就是怎么利用lp[i]来解分这100w个数,其实这一步的算计量跟数的个数关无,跟数的巨细有关。
我们可以用一个组数cnt[i]示表i这个素数现出的次数,那么接下来这段代码就是精华了。
for(int i = 0; i < n; i++) scanf("%d",&a[i]),cnt[a[i]]++,sum+=a[i]; for(int i = M - 10; i >= 2; i--) cnt[i] += cnt[i+1]; for(int i = M - 10; i >= 2; i--) { if(lp[i]!=i) cnt[lp[i]] += cnt[i]; cnt[i/lp[i]] += cnt[i]; }
自己研讨研讨还是挺乐快的。。。。。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long lld; const int maxn = 1000010; const int M = 10000010; int a[maxn]; int prime[M]; int lp[M]; lld cnt[M]; int tot; void init() // precalc in O(n) and get lp[i](the minimum prime factor of i) { for(int i = 2; i <= M-10; i++) { if(!lp[i]){ lp[i] = i; prime[tot++] = i; } for(int j = 0; j < tot && i*prime[j]<=10000000; j++) { lp[i*prime[j]] = prime[j]; if(i%prime[j]==0) break; } } } bool check(lld mid) { for(int i = 0;i < tot; i++) { lld tmp = mid,sum=0; while(tmp) { tmp /= prime[i]; sum += tmp; } if(sum < cnt[prime[i]]) return false; } return true; } int main() { init(); int n; scanf("%d",&n); lld sum = 0; for(int i = 0; i < n; i++) scanf("%d",&a[i]),cnt[a[i]]++,sum+=a[i]; for(int i = M - 10; i >= 2; i--) cnt[i] += cnt[i+1]; for(int i = M - 10; i >= 2; i--) { if(lp[i]!=i) cnt[lp[i]] += cnt[i]; cnt[i/lp[i]] += cnt[i]; } lld l = 1 , r = sum , best = -1; while(l <= r) { lld mid = l + r >> 1; if(check(mid)) { best = mid; r = mid - 1; } else { l = mid + 1; } } printf("%I64d\n",best); return 0; }
文章结束给大家分享下程序员的一些笑话语录: 一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
于是他去问Lippman。
Lippman说"程序员的未来就是驾驭程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
于是他去问Gates。
Gates说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")