HUD 4038
来源:互联网 发布:淘宝上每日好店在哪 编辑:程序博客网 时间:2024/04/30 11:27
好像是成都赛的题目,看了一下,蒙了,规律题,比赛题和平时的练习题真的差太远,努力。
http://acm.hdu.edu.cn/showproblem.php?pid=4038
看了一下讨论,最后还是做出来了,骄傲一下。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long llg;const int N = 100001;const llg P = 1000000007LL;int n;llg m, a[N];llg exp_mod(llg a,llg n,llg b){ llg t; if(n==0) return 1%b; if(n==1) return a%b; t=exp_mod(a,n/2,b); t=t*t%b; if((n&1)==1) t=t*a%b; return t;}int main(){ int ct, i; llg ans; int T, Case = 0; scanf("%d", &T); while(T--) { scanf("%d%I64d", &n, &m); for(i = 0; i < n; i++) scanf("%I64d", a+i); sort(a, a+n); ans = 1; for(i = ct = 0; i < n; i++) ct += (a[i]<0); if(ct & 1) { for(i = 0; i < n; i++) if(a[i] >= 0) break; i--; if(0-a[i] <= m) { m += a[i]; a[i] = 0; } else { a[i] += m; m = 0; } } for(i = 0; i<n && m>0; i++) if(a[i] == 0) { a[i]++; m--; } if(m > 0) { for(i = 0; i < n; i++) if(a[i] == 1) { a[i]++; m--; if(m == 0) break; } for(i = 0; i<n && m>0; i++) if(a[i] == 2) { a[i]++; m--; } if(m%3 == 1) { if(m == 1) { sort(a, a+n); for(i = 0; i < n; i++) if(a[i] >= 0) { a[i]++; m--; break; } } else { m -= 4; ans = ans*4 % P; } } ans = ans * exp_mod(3, m/3,P) % P; if(m%3 == 2) ans = ans*2 % P; } for(i = 0; i < n; i++) ans = (a[i]%P)*ans % P; printf("Case %d: %I64d\n", ++Case, ans); } return 0;}
思路:主要分析(1)负数的数目;(2)遇到数0、1、2的3种情况;(3)对m为1、2、3和>3计算
- HUD 4038
- HUD
- HUD 1000
- HUD 1033
- HUD P1561
- HUD 4473
- HUD 4502
- Hud 4608
- hud 2073
- hud 1518
- HUD-1142
- Unity HUD
- UDK HUD
- hud 2795
- hud 4288
- hud Fibonacci
- hud 4790
- hud 3713
- 对工作没兴趣,为什么呢
- Ubuntu 11.04 系统下安装redmine
- 这是我见过的最精彩的一篇“高考作文”
- Ubuntu Redmine安装配置
- HDU 2028
- HUD 4038
- HowTo Install Redmine in Ubuntu - Redmine
- HDU 2029
- HDU 1267
- Linux 安装设置备忘录
- 如果你再不改变的话 !
- 给师弟们学校最后生活的一些想法
- 发布一个iPhone版“远程桌面”
- 我的宣言