Powered By HC TECH : AutoACer Engine

4500-4599
pull/42/head
KiritoTRw 2016-09-06 13:32:33 +08:00 committed by GitHub
parent a34c463144
commit c9791a72c9
89 changed files with 6427 additions and 0 deletions

64
HDOJ/4500_autoAC.cpp Normal file
View File

@ -0,0 +1,64 @@
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
int i,j;
struct node{
int x,y,sum;
}s[520];
int a[22][22];
int cmp(node a,node b)
{
if(a.sum!=b.sum)
return a.sum>b.sum;
else if(a.x!=b.x)
return a.x<b.x;
else if(a.y!=b.y)
return a.y<b.y;
}
int main()
{
while(~scanf("%d%d",&n,&m),n||m)
{
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
scanf("%d",&a[i][j]);
}
}
int cnt=0;
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
if(a[i][j]*a[i-1][j]<0)
s[cnt].sum+=abs(a[i-1][j]);
else
s[cnt].sum-=abs(a[i-1][j]);
if(a[i][j]*a[i+1][j]<0)
s[cnt].sum+=abs(a[i+1][j]);
else
s[cnt].sum-=abs(a[i+1][j]);
if(a[i][j]*a[i][j-1]<0)
s[cnt].sum+=abs(a[i][j-1]);
else
s[cnt].sum-=abs(a[i][j-1]);
if(a[i][j]*a[i][j+1]<0)
s[cnt].sum+=abs(a[i][j+1]);
else
s[cnt].sum-=abs(a[i][j+1]);
s[cnt].x=i;
s[cnt].y=j;
cnt++;
}
}
sort(s,s+cnt,cmp);
printf("%d %d %d\n",s[0].x,s[0].y,s[0].sum);
}
return 0;
}

41
HDOJ/4501_autoAC.cpp Normal file
View File

@ -0,0 +1,41 @@
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[2][105][105][10];
int val[105];
int c1[105];
int c2[105];
int main()
{
int n,v1,v2,k;
while(scanf("%d%d%d%d",&n,&v1,&v2,&k)!=EOF)
{
int i;
for(i=1;i<=n;i++)
scanf("%d%d%d",&c1[i],&c2[i],&val[i]);
memset(dp,0,sizeof(dp));
int now=0;
for(i=1;i<=n;i++)
{
now=now^1;
for(int j=0;j<=v1;j++)
{
for(int l1=0;l1<=v2;l1++)
{
for(int l2=0;l2<=k;l2++)
{
dp[now][j][l1][l2]=dp[now^1][j][l1][l2];
if(j>=c1[i]&&dp[now][j][l1][l2]<dp[now^1][j-c1[i]][l1][l2]+val[i])
dp[now][j][l1][l2]=dp[now^1][j-c1[i]][l1][l2]+val[i];
if(l1>=c2[i]&&dp[now][j][l1][l2]<dp[now^1][j][l1-c2[i]][l2]+val[i])
dp[now][j][l1][l2]=dp[now^1][j][l1-c2[i]][l2]+val[i];
if(l2>=1&&dp[now][j][l1][l2]<dp[now^1][j][l1][l2-1]+val[i])
dp[now][j][l1][l2]=dp[now^1][j][l1][l2-1]+val[i];
}
}
}
}
printf("%d\n",dp[now][v1][v2][k]);
}
}

29
HDOJ/4502_autoAC.cpp Normal file
View File

@ -0,0 +1,29 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int n,m,i,j,t;
int a[105][105],dp[105];
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for(i = 1;i<=m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
a[x][y] = max(a[x][y],c);
}
for(i = 1;i<=n;i++)
{
for(j = i;j>=1;j--)
dp[i] = max(dp[i],dp[j-1]+a[j][i]);
}
printf("%d\n",dp[n]);
}
return 0;
}

20
HDOJ/4503_autoAC.cpp Normal file
View File

@ -0,0 +1,20 @@
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,num[1010];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int ans=0;
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
ans+=1*num[i]*(n-1-num[i]);
}
ans/=2;
printf("%.3f\n",1.0-ans*1.0/((n*(n-1)*(n-2))/6));
}
return 0;
}

44
HDOJ/4504_autoAC.cpp Normal file
View File

@ -0,0 +1,44 @@
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
__int64 d[100][300];
int main()
{
__int64 A,B,t;
while(scanf("%I64d%I64d%I64d",&A,&B,&t)!=-1)
{
t/=15;
B+=t/2;
t=(t+1)/2;
d[0][0]=1;
for(__int64 j=1;j<=3*t;j++)
{
d[0][j]=0;
}
for(__int64 i=1;i<=t;i++)
{
d[i][0]=0;
d[i][1]=d[i-1][0];
d[i][2]=d[i-1][0]+d[i-1][1];
for(__int64 j=3;j<=3*t;j++)
{
d[i][j]=d[i-1][j-1]+d[i-1][j-2]+d[i-1][j-3];
}
}
__int64 ans=0;
__int64 j=B-A+1;
if(j<0)
{
j=0;
}
for(;j<=3*t;j++)
{
ans+=d[t][j];
}
printf("%I64d\n",ans);
}
return 0;
}

28
HDOJ/4505_autoAC.cpp Normal file
View File

@ -0,0 +1,28 @@
#include<stdio.h>
#include<string.h>
int main()
{
int a, i, c, n, cnt[105];
scanf("%d",&c);
while(c--)
{
scanf("%d",&n);
memset(cnt, 0, sizeof(cnt));
int Max = 0;
for(i = 0; i < n; i++)
{
scanf("%d",&a);
cnt[a]++;
if(a > Max)
Max = a;
}
int ans = Max * 10;
for(i = 1; i <= Max; i++)
{
if(cnt[i])
ans += 5 + cnt[i];
}
printf("%d\n",ans);
}
return 0;
}

32
HDOJ/4506_autoAC.cpp Normal file
View File

@ -0,0 +1,32 @@
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1e9+7;
long long n,t,k;
long long num[10010],res[10010];
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%I64d%I64d%I64d",&n,&t,&k);
long long tmpt=t,tmpk=1;
while(tmpt){
if(tmpt&1)
tmpk=(tmpk*k)%mod;
tmpt>>=1;
k=(k*k)%mod;
}
for(int i=0;i<n;i++){
scanf("%I64d",&num[i]);
num[i]=(num[i]*tmpk)%mod;
}
t=t%n;
for(int i=0;i<n;i++)
res[(i+t)%n]=num[i];
for(int i=0;i<n-1;i++)
printf("%I64d ",res[i]);
printf("%I64d\n",res[n-1]);
}
return 0;
}

66
HDOJ/4507_autoAC.cpp Normal file
View File

@ -0,0 +1,66 @@
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
using namespace std;
typedef long long LL;
typedef pair< int,pair<LL,LL> > PILL;
#define F first
#define S second
#define MP make_pair
const int mod = 1e9 + 7;
int digit[20];
LL pow10[20];
PILL dp[20][7][7][2];
bool vis[20][7][7][2];
PILL dfs(int len,int sum,int remain,bool contain,bool fp)
{
if(!len)
if(!contain && sum && remain)
return MP(1,MP(0LL,0LL));
else
return MP(0,MP(0LL,0LL));
if(!fp && vis[len][sum][remain][contain])
return dp[len][sum][remain][contain];
PILL ret = MP(0,MP(0,0));
int fpmax = fp ? digit[len] : 9;
for(int i=0;i<=fpmax;i++)
{
PILL nxt = dfs(len-1,(sum + i) % 7,(remain * 10 + i) % 7,contain | (i == 7),fp && i == fpmax);
LL pref = i * pow10[len-1] % mod;
(ret.F += nxt.F) %= mod;
(ret.S.F += nxt.S.F + pref * nxt.F) %= mod;
(ret.S.S += nxt.S.S + pref * pref % mod * nxt.F + 2 * pref * nxt.S.F) %= mod;
}
if(!fp)
{
vis[len][sum][remain][contain] = true;
dp[len][sum][remain][contain] = ret;
}
return ret;
}
long long f(long long n)
{
int len = 0;
while(n)
{
digit[++len] = n % 10;
n /= 10;
}
return dfs(len,0,0,0,true).S.S;
}
int main()
{
pow10[0] = 1;
for(int i=1;i<20;i++)
pow10[i] = pow10[i-1] * 10 % mod;
int T;
scanf("%d",&T);
while(T--)
{
long long a,b;
scanf("%I64d%I64d",&a,&b);
printf("%I64d\n",(f(b) - f(a-1) + mod) % mod);
}
return 0;
}

27
HDOJ/4508_autoAC.cpp Normal file
View File

@ -0,0 +1,27 @@
#include<iostream>
#include<string.h>
const int N=110;
using namespace std;
int dp[N*N*10];
struct Node{
int a,b;
}node[N];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
scanf("%d%d",&node[i].a,&node[i].b);
}
int m;
scanf("%d",&m);
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<=m;j++){
if(j<node[i].b)continue;
dp[j]=max(dp[j],dp[j-node[i].b]+node[i].a);
}
}
printf("%d\n",dp[m]);
}
return 0;
}

53
HDOJ/4509_autoAC.cpp Normal file
View File

@ -0,0 +1,53 @@
#include<cstdio>
#include<stdlib.h>
const int maxn=500005;
struct time
{
int start;
int end;
}t[maxn];
int cmp(const void*a,const void*b)
{
time*c=(time*)a;
time*d=(time*)b;
return c->start-d->start;
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int N;
while(~scanf("%d",&N))
{
int a,b,c,d;
char ss;
int i;
for(i=0;i<N;i++)
{
scanf("%d%c%d%d%c%d",&a,&ss,&b,&c,&ss,&d);
t[i].start=a*60+b;
t[i].end=c*60+d;
}
qsort(t,N,sizeof(t[0]),cmp);
int starttime=t[0].start,endtime=t[0].end;
int alltime=0;
for(i=1;i<N;i++)
{
if(t[i].start<=endtime)
{
endtime=max(endtime,t[i].end);
}
else
{
alltime+=(endtime-starttime);
starttime=t[i].start;
endtime=t[i].end;
}
}
alltime+=(endtime-starttime);
printf("%d\n",1440-alltime);
}
return 0;
}

34
HDOJ/4510_autoAC.cpp Normal file
View File

@ -0,0 +1,34 @@
#include<stdio.h>
int main(){
int h,m,s,a,b,c,T;
scanf("%d",&T);
while(T--) {
scanf("%d%*c%d%*c%d",&h,&m,&s);
scanf("%d%*c%d%*c%d",&a,&b,&c);
a=a%12;
s=s-c;
if(s<0) {
s+=60;
m--;
if(m<0){
m+=60;
h--;
if(h<0) h+=12;
}
}
m-=b;
if(m<0){
m+=60;
h--;
if(h<0) h+=12;
}
h=(h-a+12)%12;
if(h<10) printf("0%d:",h);
else printf("%d:",h);
if(m<10) printf("0%d:",m);
else printf("%d:",m);
if(s<10) printf("0%d\n",s);
else printf("%d\n",s);
}
return 0;
}

127
HDOJ/4511_autoAC.cpp Normal file
View File

@ -0,0 +1,127 @@
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const double INF = 1e20;
int n;
pair<int,int> p[100];
double dis(pair<int,int>a,pair<int,int>b)
{
return sqrt((double)(1.0 * a.first - b.first) * (1.0 * a.first - b.first) + (double)(1.0 * a.second - b.second)*(1.0 * a.second - b.second));
}
double dp[55][1000];
void CheckMin(double &a,double b)
{
a = min(a,b);
}
struct Trie
{
int next[1000][55],fail[1000],end[1000];
int root,L;
int newnode()
{
for(int i = 1; i <= n;i++)
next[L][i] = -1;
end[L++] = 0;
return L-1;
}
void init()
{
L = 0;
root = newnode();
}
void insert(int a[],int cnt)
{
int now = root;
for(int i = 0;i < cnt;i++)
{
if(next[now][a[i]] == -1)
next[now][a[i]] = newnode();
now = next[now][a[i]];
}
end[now] = 1;
}
void build()
{
queue<int>Q;
fail[root] = root;
for(int i = 1;i <= n;i++)
if(next[root][i] == -1)
next[root][i] = root;
else
{
fail[next[root][i]] = root;
Q.push(next[root][i]);
}
while(!Q.empty())
{
int now = Q.front();
Q.pop();
end[now] |= end[fail[now]];
for(int i = 1;i <= n;i++)
if(next[now][i] == -1)
next[now][i] = next[fail[now]][i];
else
{
fail[next[now][i]] = next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
void solve()
{
for(int i = 1;i <= n;i++)
for(int j = 0;j < L;j++)
dp[i][j] = INF;
dp[1][next[root][1]] = 0;
for(int i = 1;i < n;i++)
for(int j = 0;j < L;j++)
if(dp[i][j] < INF)
{
for(int k = i+1;k <= n;k++)
{
int ss = next[j][k];
if(end[ss])continue;
CheckMin(dp[k][ss],dp[i][j] + dis(p[i],p[k]));
}
}
double ans = INF;
for(int i = 0;i < L;i++)
if(dp[n][i] < INF)
CheckMin(ans,dp[n][i]);
if(ans == INF)printf("Can not be reached!\n");
else printf("%.2f\n",ans);
}
}ac;
int a[10];
int main()
{
int m;
while(scanf("%d%d",&n,&m) == 2)
{
if(n == 0 && m == 0)break;
for(int i = 1;i <= n;i++)
scanf("%d%d",&p[i].first,&p[i].second);
ac.init();
int k;
while(m--)
{
scanf("%d",&k);
for(int i = 0;i < k;i++)
scanf("%d",&a[i]);
ac.insert(a,k);
}
ac.build();
ac.solve();
}
return 0;
}

40
HDOJ/4512_autoAC.cpp Normal file
View File

@ -0,0 +1,40 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAXN 205
int a[MAXN];
int f[MAXN][MAXN];
int main()
{
int T, N;
for(scanf("%d", &T); T--; )
{
scanf("%d", &N);
for(int i = 1; i <= N; ++i)
scanf("%d", &a[i]);
memset(f, 0, sizeof(f));
int ans = 1;
for(int i = 1; i <= N; ++i)
{
int max = 0;
for(int j = N; i < j; --j)
{
f[i][j] = f[i-1][j];
if((a[i] == a[j]) && (f[i][j] < max + 1))
f[i][j] = max + 1;
else if((a[i] > a[j]) &&(f[i-1][j] > max)) max = f[i-1][j];
if(f[i][j] * 2 > ans) ans = f[i][j] * 2;
for(int k = i + 1; k < j; ++k)
{
if(a[k] > a[j])
{
if(2 * f[i][j] + 1 > ans)
ans = 2 * f[i][j] + 1;
}
}
}
}
printf("%d\n", ans);
}
return 0;
}

61
HDOJ/4513_autoAC.cpp Normal file
View File

@ -0,0 +1,61 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 100005
int a[MAXN * 2];
struct Rem{
int left;
int right;
}rem;
int odd[2 * MAXN];
int min(int a, int b)
{
return (a < b) ? a : b;
}
int fun(int i, int m, int N)
{
int l = i - m - 1, r = i + m + 1;
int ret = 0;
for(;(l > 0)&&(r <= N);--l, ++r)
{
if((a[r] == -1) || ((a[l] == a[r]) && ((r - l == 2)||(a[r] <= a[r - 2]) )))
++ret;
else break;
}
return ret;
}
int main()
{
int T, N;
for(scanf("%d", &T); T--; )
{
scanf("%d", &N);
int i = 0;
a[++i] = -1;
while(N--)
{
scanf("%d", &a[++i]);
a[++i] = -1;
}
N = i;
rem.left = rem.right = 0;
int ans = 1;
memset(odd, 0, sizeof(odd));
for(int i = 1; i <= N; ++i)
{
int m = 0;
if(rem.right > i)
m = min(rem.right - i, odd[rem.left + (rem.right - i)]);
odd[i] = m + fun(i, m, N);
if(i + odd[i] > rem.right)
{
rem.left = i - odd[i];
rem.right = i + odd[i];
}
if(odd[i] > ans)
ans = odd[i];
}
printf("%d\n", ans);
}
return 0;
}

64
HDOJ/4514_autoAC.cpp Normal file
View File

@ -0,0 +1,64 @@
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int N = 100005;
int n, m, ans;
int set[N];
int dp[N];
struct Edge {
int v, f;
Edge() {}
Edge(int _v, int _f) : v(_v), f(_f) {}
};
vector<Edge>vt[N];
int find(int x) {
return x == set[x] ? x : x = find(set[x]);
}
void dfs(int p, int u) {
int forkmax = 0;
for (int i = 0; i < (int)vt[u].size(); ++i) {
int v = vt[u][i].v, f = vt[u][i].f;
if (v == p) continue;
dfs(u, v);
ans = max(ans, dp[v]+f+forkmax);
forkmax = max(forkmax, dp[v] + f);
}
dp[u] = forkmax;
}
void solve() {
for (int i = 1; i <= n; ++i) {
if (dp[i] == -1) dfs(0, i);
}
printf("%d\n", ans);
}
int main() {
while (scanf("%d %d", &n, &m) != EOF) {
int a, b, c, x, y;
bool loop = false;
ans = 0;
for (int i = 1; i <= n; ++i) {
dp[i] = -1;
set[i] = i;
vt[i].clear();
}
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &a, &b, &c);
if (loop) continue;
x = find(a), y = find(b);
if (x != y) set[x] = y;
else loop = true;
vt[a].push_back(Edge(b, c));
vt[b].push_back(Edge(a, c));
}
if (loop) {
puts("YES");
continue;
}
solve();
}
return 0;
}

68
HDOJ/4515_autoAC.cpp Normal file
View File

@ -0,0 +1,68 @@
#include <stdio.h>
int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
const int Y = 2013,M = 3,D = 24;
int leap(int y)
{
if(y%400 == 0 || (y%4==0 && y%100!=0))
return 1;
return 0;
}
void deal1(int k)
{
int y = Y,m = M,d = D;
while(k--)
{
if(leap(y))
a[2] = 29;
else
a[2] = 28;
d--;
if(d<=0)
{
m--;
if(m<=0)
{
m = 12;
y--;
}
d = a[m];
}
}
printf("%04d/%02d/%02d",y,m,d);
}
void deal2(int k)
{
int y = Y,m = M,d = D;
while(k--)
{
if(leap(y))
a[2] = 29;
else
a[2] = 28;
d++;
if(d>a[m])
{
m++;
if(m>12)
{
m = 1;
y++;
}
d = 1;
}
}
printf("%04d/%02d/%02d ",y,m,d);
}
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
deal2(m);
deal1(m);
printf("\n");
}
return 0;
}

122
HDOJ/4516_autoAC.cpp Normal file
View File

@ -0,0 +1,122 @@
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <vector>
using namespace std;
char str[500];
int seq[10];
long long _pow(int a, int b) {
long long ret = 1;
for (int i = 0; i < b; ++i) {
ret *= a;
}
return ret;
}
int jiechen[10] = {1, 1, 2, 6, 24, 120};
void qiudao(int *rec, int k) {
for (int i = k; i <= 5; ++i) {
rec[i-k] = jiechen[i] / jiechen[i-k] * seq[i];
}
}
bool judge(int rec[], int x) {
long long sum = 0;
for (int i = 0; i <= 5; ++i) {
sum += 1LL * rec[i] * _pow(x, i);
}
return sum == 0;
}
void gao(char ts[]) {
int len = strlen(ts);
int p = -1, a, b;
for (int i = 0; i < len; ++i) {
if (ts[i] == 'x') {
if (isdigit(ts[i-1])) {
ts[i] = '\0';
} else {
ts[i] = '1';
}
p = -2;
} else if (ts[i] == '^') {
ts[i] = '\0';
p = i+1;
}
}
a = atoi(ts);
if (!a && p != -1) a = 1;
if (p == -1) {
b = 0;
} else if (p == -2) {
b = 1;
}else {
b = atoi(ts+p);
}
seq[b] += a;
}
void solve() {
vector<int>v;
int cnt = 0;
memset(seq, 0, sizeof (seq));
char ts[50], *p;
p = strtok(str, "+");
while (p) {
strcpy(ts, p);
gao(ts);
p = strtok(NULL, "+");
}
for (int i = 5; i >= 0; --i) {
if (seq[i] != 0) {
cnt = i;
break;
}
}
for (int i = -1000; i <= 1000; ++i) {
for (int j = 0; j < cnt; ++j) {
int rec[10] = {0};
qiudao(rec, j);
if (judge(rec, i)) {
v.push_back(i);
} else {
break;
}
}
}
if (v.size() != cnt || seq[cnt] != 1 || cnt == 0) {
printf("-1\n");
} else {
sort(v.begin(), v.end());
for (int i = v.size()-1; i >= 0; --i) {
if (v[i] < 0) {
printf("(x+%d)", -v[i]);
} else if (v[i] == 0) {
printf("x");
} else {
printf("(x-%d)", v[i]);
}
}
puts("");
}
}
int main() {
int T, ca = 0;
scanf("%d", &T);
while (T--) {
scanf("%s", str);
int len = strlen(str);
for (int i = 0; i < len; ++i) {
if (str[i] == '-') {
for (int j = len-1; j >= i; --j) {
str[j+1] = str[j];
}
str[i] = '+';
len += 1;
++i;
str[len] = '\0';
}
}
printf("Case #%d: ", ++ca);
solve();
}
return 0;
}

76
HDOJ/4517_autoAC.cpp Normal file
View File

@ -0,0 +1,76 @@
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
#define REP(i,n) for(int i=0;i < (n);i++)
#define REPD(i,n) for(int i=(n-1);i >= 0;i--)
#define FOR(i,s,t) for(int i = (s);i <= (t);i++)
#define FORD(i,s,t) for(int i = (s);i >= (t);i--)
#define PII pair<int,int>
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
#define lowbit(x) (x&(-x))
#define INF (1<<30)
int n,m;
int C[2011][2011];
char str[2011][2011];
void fun(){
C[0][0] = 0;
FOR(i,1,n){
C[i][0] = 0;
FOR(j,1,m){
C[i][j] = C[i][j-1]+(str[i][j]=='*'?1:0);
}
}
FOR(i,2,n){
FOR(j,1,m){
C[i][j] += C[i-1][j];
}
}
}
int Area(int x1,int y1,int x2,int y2){
if(x1>x2)swap(x1,x2);
if(y1>y2)swap(y1,y2);
return C[x2][y2]-C[x2][y1-1]-C[x1-1][y2]+C[x1-1][y1-1];
}
int main()
{
while(~scanf("%d%d",&n,&m),n,m){
int x,y;
scanf("%d%d",&x,&y);
FOR(i,1,n)scanf("%s",str[i]+1);
fun();
int ans = 0;
FOR(i,1,n){
FOR(j,1,m){
if(str[i][j] != '*')continue;
int xx1 = i+x-1;
int yy1 = j+y-1;
if(!(xx1<1||yy1<1||xx1>n||yy1>m)){
if(Area(i,j,xx1,yy1) == x*y)ans++;
}
int xx2 = i+y-1;
int yy2 = j+x-1;
if(xx2 == xx1 && yy2==yy1)continue;
if(xx2<1||yy2<1||xx2>n||yy2>m)continue;
if(Area(i,j,xx2,yy2) == x*y)ans++;
}
}
printf("%d\n",ans);
}
return 0;
}

137
HDOJ/4518_autoAC.cpp Normal file
View File

@ -0,0 +1,137 @@
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
typedef long long LL;
const int N = 600;
LL n;
int bit[20];
LL f[60];
LL dp[15][N];
LL POW[15];
LL seq[60];
LL suf[20];
queue<int>q;
struct Ac_Auto{
int ch[N][10];
int fail[N];
bool flag[N];
int idx, root;
int newnd() {
memset(ch[idx], 0, sizeof (ch[idx]));
flag[idx] = false, fail[idx] = 0;
return idx++;
}
void init() {
idx = 0, root = newnd();
}
void insert(LL x) {
int id = 0;
while (x) bit[id++] = x%10, x/=10;
int p = root;
for (int i = id-1; i >= 0; --i) {
if (!ch[p][bit[i]]) ch[p][bit[i]] = newnd();
p = ch[p][bit[i]];
}
flag[p] = true;
}
void build() {
for (int i = 0; i < 10; ++i) {
if (ch[root][i]) {
q.push(ch[root][i]);
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < 10; ++i) {
int &v = ch[u][i];
int x = fail[u];
if (v) {
q.push(v);
while (x && !ch[x][i]) x = fail[x];
fail[v] = ch[x][i];
flag[v] = flag[v] || flag[fail[v]];
} else {
v = ch[x][i];
}
}
}
}
void find(LL x) {
int id = 0;
while (x) bit[id++] = x%10, x/=10;
int p = root;
for (int i = id-1; i >= 0; --i) {
p = ch[p][bit[i]];
if (flag[p]) {
cout << "OMG" << endl;
return;
}
}
}
};
Ac_Auto ac;
LL count(int p, int sta, bool bound) {
if (p == 0) return 0;
if (!bound && ~dp[p][sta]) return dp[p][sta];
int y = bound ? bit[p] : 9;
LL sum = 0;
int tsta;
for (int i = 0; i <= y; ++i) {
tsta = ac.ch[sta][i];
if (ac.flag[tsta]) {
if (bound&&i==y) sum += suf[p-1]+1;
else sum += POW[p-1];
continue;
}
sum += ::count(p-1, tsta, bound&&i==y);
}
if (!bound) dp[p][sta] = sum;
return sum;
}
LL cal(LL x) {
int idx = 1;
while (x) suf[idx] = suf[idx-1]+x%10*POW[idx-1], bit[idx++] = x%10, x/=10;
return ::count(idx-1, ac.root, true);
}
void prepare() {
f[1] = 1, f[2] = 1;
for (int i = 3; i <= 55; ++i) {
f[i] = f[i-1] + f[i-2];
}
ac.init();
for (int i = 7; i <= 55; ++i) {
ac.insert(f[i]);
}
ac.build();
POW[0] = 1;
for (int i = 1; i < 15; ++i) POW[i] = POW[i-1] * 10;
memset(dp, 0xff, sizeof (dp));
LL tmp;
for (int i = 2; i <= 55; ++i) {
LL l = 13, r = POW[12], mid;
while (l <= r) {
mid = (l + r) >> 1;
if ((tmp=cal(mid)) < f[i]) l = mid + 1;
else if (tmp > f[i]) r = mid - 1;
else seq[i] = mid, r = mid - 1;
}
}
}
int main() {
prepare();
while (cin >> n, n != -1) {
LL ret = 1LL << 60;
for (int i = 2; i <= 55; ++i) {
LL t = seq[i] - n;
if (t < 0) t = -t;
ret = min(ret, t);
}
cout << ret << endl;
}
return 0;
}

23
HDOJ/4519_autoAC.cpp Normal file
View File

@ -0,0 +1,23 @@
#include <iostream>
using namespace std;
int main()
{
int n,k,m,t;
cin >> t;
while(t--)
{
cin >> n >> k >> m;
if(m>n)
cout << k<< endl;
else
{
int sub = n*k;
if(sub%m==0)
cout << sub/m;
else
cout << sub/m+1;
cout << endl;
}
}
return 0;
}

37
HDOJ/4520_autoAC.cpp Normal file
View File

@ -0,0 +1,37 @@
#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
double s[25],temp[25];
int main()
{
int n;
while(scanf("%d", &n) && n)
{
for(int i = 1; i <= n; ++i)
{
scanf("%lf", &s[i]);
temp[i] = s[i];
}
sort(temp + 1, temp + n + 1);
double sum = 0;
for(int i = 2; i < n; ++i)
sum += temp[i];
sum /= (n - 2);
double min = 10000000;
int ans;
for(int i = 1; i <= n; ++i)
{
if(fabs(s[i] - sum) < min)
{
min = fabs(s[i] - sum);
ans = i;
}
}
printf("%d\n", ans);
}
return 0;
}

51
HDOJ/4521_autoAC.cpp Normal file
View File

@ -0,0 +1,51 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define lz 2*u,l,mid
#define rz 2*u+1,mid+1,r
const int maxn=110000;
int sum[2*maxn], dp[maxn+5], a[maxn+5];
void Update(int u, int l, int r, int p, int c)
{
sum[u]=max(sum[u],c);
if(l==r)return ;
int mid=(l+r)>>1;
if(p<=mid) Update(lz,p,c);
else Update(rz,p,c);
}
int Query(int u, int l, int r, int tl, int tr)
{
if(tl>tr) return 0;
if(tl<=l&&r<=tr) return sum[u];
int mid=(l+r)>>1;
if(tr<=mid) return Query(lz,tl,tr);
else if(tl>mid) return Query(rz,tl,tr);
else
{
int t1=Query(lz,tl,mid);
int t2=Query(rz,mid+1,tr);
return max(t1,t2);
}
}
int main()
{
int n, d;
while(scanf("%d%d",&n,&d)!=EOF)
{
memset(sum,0,sizeof(sum));
for(int i=1; i<=n; i++)
scanf("%d",a+i);
int maxx=0;
for(int i=1; i<=n; i++)
{
if(i>d+1) Update(1,1,maxn,a[i-d-1]+1,dp[i-d-1]);
dp[i]=Query(1,1,maxn,1,a[i])+1;
maxx=max(dp[i],maxx);
}
printf("%d\n",maxx);
}
return 0;
}

113
HDOJ/4522_autoAC.cpp Normal file
View File

@ -0,0 +1,113 @@
#include<iostream>
#include<cstring>
#include<algorithm>
const int N=207;
const int inf=1e7;
using namespace std;
int dist1[N];
int dist0[N];
int visited[N];
int edge1[N][N];
int edge0[N][N];
int n,m,k;
void Dijkstra1(int u){
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++){
dist1[i]=edge1[u][i];
}
visited[u]=1;
for(int i=1;i<n;i++){
int min=inf,v=u;
for(int j=1;j<=n;j++){
if(dist1[j]<min&&!visited[j]){
min=dist1[j];
v=j;
}
}
if(min==inf)return ;
visited[v]=1;
for(int k=1;k<=n;k++){
if(!visited[k]&&edge1[v][k]<inf&&dist1[v]+edge1[v][k]<dist1[k]){
dist1[k]=dist1[v]+edge1[v][k];
}
}
}
}
void Dijkstra0(int u){
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++){
dist0[i]=edge0[u][i];
}
visited[u]=1;
for(int i=1;i<n;i++){
int min=inf,v=u;
for(int j=1;j<=n;j++){
if(dist0[j]<min&&!visited[j]){
min=dist0[j];
v=j;
}
}
if(min==inf)return ;
visited[v]=1;
for(int k=1;k<=n;k++){
if(!visited[k]&&edge0[v][k]<inf&&dist0[v]+edge0[v][k]<dist0[k]){
dist0[k]=dist0[v]+edge0[v][k];
}
}
}
}
int main(){
int _case;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
char str[10100];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
edge1[i][j]=edge1[j][i]=inf;
edge0[i][j]=edge0[j][i]=inf;
}
}
for(int i=1;i<=m;i++){
scanf("%s%d",str,&k);
int len=strlen(str);
int s1=0,s2=0;
if(k==1){
for(int j=0;j<len;j++){
while(str[j]!='+'&&j<len){
s2=s2*10+str[j]-'0';
j++;
}
edge1[s1][s2]=1;
edge0[s1][s2]=1;
s1=s2;
s2=0;
}
}else if(k==0){
for(int j=0;j<len;j++){
while(str[j]!='+'&&j<len){
s2=s2*10+str[j]-'0';
j++;
}
edge0[s1][s2]=1;
s1=s2;
s2=0;
}
}
}
int d1,d2,u,v;
scanf("%d%d%d%d",&d1,&d2,&u,&v);
Dijkstra1(u);
Dijkstra0(u);
if(dist1[v]==inf&&dist0[v]==inf){
printf("-1\n");
}else if(dist1[v]==inf&&dist0[v]<inf){
printf("%d\n",dist0[v]*d1);
}else if(dist1[v]<inf&&dist0[v]==inf){
printf("%d\n",dist1[v]*d2);
}else {
printf("%d\n",min(dist1[v]*d2,dist0[v]*d1));
}
}
return 0;
}

58
HDOJ/4523_autoAC.cpp Normal file
View File

@ -0,0 +1,58 @@
#include<stdio.h>
#include<string.h>
char n[111],m[111],p[111],mid[111];
int compare(char *s1,char *s2)
{
int len1=strlen(s1);
int len2=strlen(s2);
if(len1>len2) return 1;
else if(len1<len2) return 0;
for(int i=0;i<len1;i++)
{
if(s1[i]>s2[i]) return 1;
else if(s2[i]>s1[i]) return 0;
}
return 1;
}
void solve(char *s1,char *s2)
{
int len=strlen(s2);
int len1=strlen(s1);
strrev(s1);
strrev(s2);
for(int i=0;i<len;i++)
{
s1[i]=s1[i]-'0'+s2[i]-'0'+'0';
}
for(int i=0;i<len1;i++)
{
if(s1[i]>'9')
{
s1[i]=s1[i]-10;
if(i+1==len1) {s1[len1]='1';s1[len1+1]='\0';}
else
s1[i+1]++;
}
}
strrev(s1);
if(compare(s1,m)) printf("YES\n");
else printf("NO\n");
}
int main()
{
while(scanf("%s %s %s",n,m,p)!=EOF)
{
if(strlen(m)==1&&m[0]-'0'<3) {printf("NO\n");continue;}
if(strcmp(p,"0")==0)
{
if(strcmp(n,m)==0) printf("YES\n");
else printf("NO\n");
continue;
}
if(compare(n,m)) {printf("YES\n"); continue;}
if(strlen(p)>strlen(n))
solve(p,n);
else solve(n,p);
}
return 0;
}

30
HDOJ/4524_autoAC.cpp Normal file
View File

@ -0,0 +1,30 @@
#include <stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
__int64 a,t = 0;
int flag = 1;
while(n--)
{
scanf("%I64d",&a);
if(flag)
{
t = a - t;
if(t<0)
{
flag = 0;
}
}
}
if(flag && !t)
printf("yeah~ I escaped ^_^\n");
else
printf("I will never go out T_T\n");
}
return 0;
}

52
HDOJ/4525_autoAC.cpp Normal file
View File

@ -0,0 +1,52 @@
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 10005;
int n;
int seq[N];
int k1, k2;
LL K;
int main() {
int T, ca = 0;
scanf("%d", &T);
while (T--) {
LL sum = 0;
int c;
scanf("%d %d %d %I64d", &n, &k1, &k2, &K);
for (int i = 0; i < n; ++i) {
scanf("%d", &c);
sum += c;
}
printf("Case #%d: ", ++ca);
if (sum > K) {
puts("0");
continue;
}
int k3 = k1 + k2;
if (k3 >= 0) {
if (k3 <= 1) {
puts("inf");
} else {
int d = 1;
while ((long double)1.0*sum <= (long double)1.0*K/k3) ++d, sum*=k3;
printf("%d\n", d);
}
} else {
if (k3 == -1) {
puts("inf");
} else {
k3 *= -1;
int d = 1;
while ((long double)1.0*sum <= (long double)1.0*K/k3) ++d, sum*=k3;
if (d & 1) printf("%d\n", d+1);
else printf("%d\n", d);
}
}
}
return 0;
}

62
HDOJ/4526_autoAC.cpp Normal file
View File

@ -0,0 +1,62 @@
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int MaX = 105;
int N, K, D, S;
struct Node {
int ti;
int qz;
}seq[MaX];
int dp[MaX][MaX];
void solve() {
memset(dp, 0xff, sizeof (dp));
dp[0][N] = 0;
for (int i = 1; i <= K; ++i) {
const int &ti = seq[i].ti;
const int &qz = seq[i].qz;
for (int j = 0; j <= N; ++j) {
if (dp[i-1][j] != -1) dp[i][j] = dp[i-1][j] + j*(ti-seq[i-1].ti);
if (j == 0) {
for (int k = 1; k <= qz; ++k) {
if (k <= N && dp[i-1][k] != -1) {
if (dp[i][0] == -1) {
dp[i][0] = D + dp[i-1][k] + k*(ti-seq[i-1].ti);
} else {
dp[i][0] = min(dp[i][0], D + dp[i-1][k] + k*(ti-seq[i-1].ti));
}
}
}
} else {
if ((j+qz) <= N && dp[i-1][j+qz] != -1) {
if (dp[i][j] == -1) {
dp[i][j] = D + dp[i-1][j+qz] + (j+qz)*(ti-seq[i-1].ti);
} else {
dp[i][j] = min(dp[i][j], D + dp[i-1][j+qz] + (j+qz)*(ti-seq[i-1].ti));
}
}
}
}
}
printf("%d\n", dp[K][0]);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d %d %d %d", &N, &K, &D, &S);
int sum = 0;
for (int i = 1; i <= K; ++i) {
scanf("%d %d", &seq[i].ti, &seq[i].qz);
sum += seq[i].qz;
}
if (sum < N) {
puts("impossible");
continue;
}
solve();
}
return 0;
}

83
HDOJ/4527_autoAC.cpp Normal file
View File

@ -0,0 +1,83 @@
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long int64;
const int INF = 0x3f3f3f3f;
const int MAXN = 10010;
int m;
int mat[8][8];
int blast[8][8];
const int dir[][2] = {{-1,0},{1,0},{0,-1},{0,1}};
struct Node{
int x, y;
int cnt;
int dir;
}Q[500000];
void addQue(int x, int y, int cnt, int& rear){
mat[x][y] = 0;
for(int i=0; i<4; ++i){
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if(dx>=1&&dx<=6&&dy>=1&&dy<=6){
Q[rear].x = dx;
Q[rear].y = dy;
Q[rear].cnt = cnt;
Q[rear++].dir = i;
}
}
}
void bfs(int x, int y){
int front=0, rear=0;
addQue(x, y, 0, rear);
int cur = 0;
while(front < rear){
while(front < rear && Q[front].cnt==cur){
Node &t = Q[front++];
if(mat[t.x][t.y]){
++mat[t.x][t.y];
} else{
Node& now = Q[rear];
now.x = t.x + dir[t.dir][0];
now.y = t.y + dir[t.dir][1];
now.cnt = t.cnt + 1;
now.dir = t.dir;
if(now.x>=1&&now.x<=6&&now.y>=1&&now.y<=6)
++rear;
}
}
for(int i=1; i<=6; ++i){
for(int j=1; j<=6; ++j)if(mat[i][j]>4){
addQue(i,j,cur+1,rear);
}
}
++cur;
}
}
int main(){
int x, y;
while(~scanf("%d", &mat[1][1])){
for(int i=1; i<=6; ++i){
for(int j=(i==1?2:1); j<=6; ++j){
scanf("%d", &mat[i][j]);
}
}
scanf("%d", &m);
for(int i=0; i<m; ++i){
scanf("%d%d", &x, &y);
if(++mat[x][y]>4){
bfs(x, y);
}
}
for(int i=1; i<=6; ++i){
for(int j=1; j<=6; ++j)
if(j!=1) printf(" %d", mat[i][j]);
else printf("%d", mat[i][j]);
putchar('\n');
}
putchar('\n');
}
return 0;
}

96
HDOJ/4528_autoAC.cpp Normal file
View File

@ -0,0 +1,96 @@
#include<iostream>
#include<algorithm>
#include<queue>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int N = 100 + 10;
char g[N][N];
int n, m, t;
int sx, sy, dx, dy, ex, ey;
bool vis[N][N][4];
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
struct node
{
int x, y, step;
int state;
node(){}
node(int xx, int yy, int st):x(xx), y(yy), step(st){ state = 0;}
};
int BFS()
{
memset(vis, false, sizeof(vis));
queue<node> Q;
Q.push(node(sx, sy, 0));
vis[sx][sy][0] = true;
while(!Q.empty())
{
node cur = Q.front();
Q.pop();
if(cur.step > t) return -1;
for(int k = 0; k < 4; ++k)
{
int x = cur.x + dir[k][0], y = cur.y + dir[k][1];
if(x < 0 || x >= n || y < 0 || y >= m) continue;
bool flag = false;
if(!(cur.state & 1) && (dx == cur.x || dy == cur.y)) flag = true;
if(!(cur.state & 2) && (ex == cur.x || ey == cur.y)) flag = true;
if(!flag) continue;
while(true)
{
if(g[x][y] == 'X') break;
if(g[x][y] == 'D') {
cur.state |= 1;
break;
}
if(g[x][y] == 'E') {
cur.state |= 2;
break;
}
x += dir[k][0], y += dir[k][1];
if(x < 0 || x >= n || y < 0 || y >= m) break;
}
}
if(cur.state == 3) {
return cur.step;
}
for(int k = 0; k < 4; ++k)
{
int x = cur.x + dir[k][0], y = cur.y + dir[k][1];
if(x < 0 || x >= n || y < 0 || y >= m || vis[x][y][cur.state] || g[x][y] == 'X') continue;
if(g[x][y] == 'D' || g[x][y] == 'E') continue;
vis[x][y][cur.state] = true;
node tmp = node(x, y, cur.step + 1);
tmp.state = cur.state;
Q.push(tmp);
}
}
return -1;
}
int main()
{
int T, cas = 0;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d",&n, &m, &t);
for(int i = 0; i < n; ++i)
{
scanf("%s",g[i]);
for(int j = 0; j < m; ++j)
{
if(g[i][j] == 'S')
sx = i, sy = j;
if(g[i][j] == 'E')
ex = i, ey = j;
if(g[i][j] == 'D')
dx = i, dy = j;
}
}
g[sx][sy] = '.';
int ans = BFS();
printf("Case %d:\n%d\n", ++cas, ans);
}
return 0;
}

95
HDOJ/4529_autoAC.cpp Normal file
View File

@ -0,0 +1,95 @@
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int t,N;
char s[10][10];
bool suit[10][1<<8+5];
int dp[8][11][1<<8][1<<8];
int one[1<<8+5];
inline void init()
{
memset(suit,0,sizeof(suit));
for(int i=0;i<8;i++)
{
for(int j=0;j< 1<<8;j++)
{
int tag=1;
for(int k=0;k<8;k++)
{
if(s[i][k]=='*'&&(j&(1<<k)))
{
tag=0;break;
}
}
if(tag) suit[i][j]=1;
}
}
}
inline int getOne(int i)
{
int ans=0;
while(i)
{
ans+=i%2;
i/=2;
}
return ans;
}
int main()
{
for(int i=0;i< 1<<8;i++)
{
one[i]=getOne(i);
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&N);
for(int i=0;i<8;i++) scanf("%s",s[i]);
init();
memset(dp,0,sizeof(dp));
for(int i=0;i< 1<<8;i++)
{
if(suit[0][i]&&one[i]<=N)
{
dp[0][one[i]][i][0]=1;
}
}
for(int i=1;i<8;i++)
for(int n=0;n<=N;n++)
for(int j=0;j< 1<<8;j++)
{
if(one[j]>n) continue;
if(!suit[i][j]) continue;
for(int k=0;k< 1<<8;k++)
{
if(one[k]+one[j]>n) continue;
if(k&(j<<2)) continue;
if(k&(j>>2)) continue;
for(int r=0;r< 1<<8;r++)
{
if(one[k]+one[j]+one[r]>n) continue;
if(r&(j<<1)) continue;
if(r&(j>>1)) continue;
dp[i][n][j][k]+=dp[i-1][n-one[j]][k][r];
}
}
}
int ans=0;
for(int i=0;i< 1<<8;i++)
{
if(suit[7][i])
{
for(int j=0;j< 1<<8;j++)
{
if(suit[6][j])
{
ans+=dp[7][N][i][j];
}
}
}
}
printf("%d\n",ans);
}
}

26
HDOJ/4530_autoAC.cpp Normal file
View File

@ -0,0 +1,26 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int t,q,a,b,i;
double x,ans;
scanf("%d",&t);
while(t--)
{
scanf("%lf%d",&x,&q);
for(i = 1; i<=q; i++)
{
scanf("%d%d",&a,&b);
if(a == 1)
ans = b*60.0-b*x;
else if(a == 2)
ans = b*3600.0/(60.0-x);
else if(a == 3)
ans = 43200*b*60/x;
printf("%.2lf\n",ans);
}
}
return 0;
}

328
HDOJ/4531_autoAC.cpp Normal file
View File

@ -0,0 +1,328 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <iostream>
using namespace std;
char str[3][3][6];
char g[3][3][6];
map<int,int>mp;
queue<int>q;
bool mo[6];
int F[50];
int find(int x)
{
if(F[x]==-1)return x;
return F[x]=find(F[x]);
}
void bing(int x,int y)
{
int t1=find(x);
int t2=find(y);
if(t1!=t2)F[t1]=t2;
}
bool judge(int state)
{
char temp[10];
int t[10];
sprintf(temp,"%09d",state);
for(int i=0;i<9;i++)t[i]=temp[i]-'0';
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
int p=t[3*i+j];
int x=p/3;
int y=p%3;
strcpy(g[i][j],str[x][y]);
}
memset(F,-1,sizeof(F));
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(g[i][j][0]==g[i][j][2])bing(12*i+4*j,12*i+4*j+2);
if(g[i][j][0]==g[i][j][3])bing(12*i+4*j,12*i+4*j+3);
if(g[i][j][1]==g[i][j][2])bing(12*i+4*j+1,12*i+4*j+2);
if(g[i][j][1]==g[i][j][3])bing(12*i+4*j+1,12*i+4*j+3);
}
for(int i=0;i<3;i++)
{
if(g[i][0][3]==g[i][1][2])bing(12*i+3,12*i+4+2);
if(g[i][1][3]==g[i][2][2])bing(12*i+4+3,12*i+8+2);
}
for(int j=0;j<3;j++)
{
if(g[0][j][1]==g[1][j][0])bing(4*j+1,12+4*j+0);
if(g[1][j][1]==g[2][j][0])bing(12+4*j+1,24+4*j+0);
}
int R=-1,G=-1,B=-1,O=-1;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<4;k++)
{
int t1=find(12*i+4*j+k);
if(g[i][j][k]=='R')
{
if(R==-1)R=t1;
else if(t1!=R)return false;
}
else if(g[i][j][k]=='G')
{
if(G==-1)G=t1;
else if(t1!=G)return false;
}
else if(g[i][j][k]=='B')
{
if(B==-1)B=t1;
else if(t1!=B)return false;
}
else
{
if(O==-1)O=t1;
else if(t1!=O)return false;
}
}
return true;
}
int bfs()
{
mp.clear();
while(!q.empty())q.pop();
int tmp,now;
char ss1[10],ss2[10];
tmp=12345678;
mp[tmp]=0;
q.push(tmp);
while(!q.empty())
{
tmp=q.front();
q.pop();
if(judge(tmp))return mp[tmp];
sprintf(ss1,"%09d",tmp);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
int t=ss1[3*i+j]-'0';
strcpy(g[i][j],str[t/3][t%3]);
}
if(mo[0])
{
strcpy(ss2,ss1);
ss2[0]=ss1[1];
ss2[1]=ss1[2];
ss2[2]=ss1[0];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
ss2[0]=ss1[2];
ss2[1]=ss1[0];
ss2[2]=ss1[1];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
}
if(mo[1])
{
strcpy(ss2,ss1);
ss2[3]=ss1[4];
ss2[4]=ss1[5];
ss2[5]=ss1[3];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
ss2[3]=ss1[5];
ss2[4]=ss1[3];
ss2[5]=ss1[4];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
}
if(mo[2])
{
strcpy(ss2,ss1);
ss2[6]=ss1[7];
ss2[7]=ss1[8];
ss2[8]=ss1[6];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
ss2[6]=ss1[8];
ss2[7]=ss1[6];
ss2[8]=ss1[7];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
}
if(mo[3])
{
strcpy(ss2,ss1);
ss2[0]=ss1[3];
ss2[3]=ss1[6];
ss2[6]=ss1[0];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
ss2[0]=ss1[6];
ss2[3]=ss1[0];
ss2[6]=ss1[3];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
}
if(mo[4])
{
strcpy(ss2,ss1);
ss2[1]=ss1[4];
ss2[4]=ss1[7];
ss2[7]=ss1[1];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
ss2[1]=ss1[7];
ss2[4]=ss1[1];
ss2[7]=ss1[4];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
}
if(mo[5])
{
strcpy(ss2,ss1);
ss2[2]=ss1[5];
ss2[5]=ss1[8];
ss2[8]=ss1[2];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
ss2[2]=ss1[8];
ss2[5]=ss1[2];
ss2[8]=ss1[5];
now=0;
for(int i=0;i<9;i++)
{
now*=10;
now+=ss2[i]-'0';
}
if(mp.find(now)==mp.end())
{
mp[now]=mp[tmp]+1;
q.push(now);
}
}
}
return -1;
}
int main()
{
int T;
scanf("%d",&T);
int iCase=0;
while(T--)
{
iCase++;
printf("Case #%d: ",iCase);
for(int i=0;i<6;i++)mo[i]=true;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
scanf("%s",&str[i][j]);
if(str[i][j][4]=='1')
{
mo[i]=false;
mo[3+j]=false;
}
}
printf("%d\n",bfs());
}
return 0;
}

47
HDOJ/4532_autoAC.cpp Normal file
View File

@ -0,0 +1,47 @@
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1000000007;
long long dp[50][520];
long long C[520][520];
long long A[520];
int a[50];
void Init(){
C[0][0]=1;
for(int i=1;i<480;i++){
C[i][0]=1;
for(int j=1;j<i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
C[i][i]=1;
}
A[0]=A[1]=1;
for(int i=2;i<480;i++)
A[i]=(A[i-1]*i)%mod;
}
int main(){
Init();
int t,n,cases=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
dp[1][a[1]-1]=1;
long long sum=a[1];
for(int i=2;i<=n;i++){
for(int j=0;j<sum;j++)
for(int k=1;k<=a[i];k++)
for(int u=0;u<=j && u<=k;u++)
dp[i][j-u+a[i]-1-(k-1)]=(dp[i][j-u+a[i]-k]+(((dp[i-1][j]*C[j][u])%mod*C[sum+1-j][k-u])%mod*C[a[i]-1][k-1])%mod)%mod;
sum+=a[i];
}
printf("Case %d: ",++cases);
long long ans=dp[n][0];
for(int i=1;i<=n;i++)
ans=(ans*A[a[i]])%mod;
cout<<ans<<endl;
}
return 0;
}

62
HDOJ/4533_autoAC.cpp Normal file
View File

@ -0,0 +1,62 @@
#include <cstdio>
#include <cstring>
const int v = 200005;
int T, N, x;
__int64 a, b, c, A[v], B[v], C[v];
void f(int s, int t) {
A[s] += a;
B[s] += b;
C[s] += c;
A[t + 1] += -a;
B[t + 1] += -b;
C[t + 1] += -c;
}
void insert(__int64 x1, __int64 y1, __int64 x2, __int64 y2) {
int m = x1 > y1 ? x1 : y1, t = x2 > y2 ? x2 : y2, t2 = x2 > y2 ? y2 : x2;
a = b = c = 0;
c = (x2 - x1) * (y2 - y1);
f(t + 1, v - 5);
a = 1;
b = -(x1 + y1);
c = x1 * y1;
if(t2 >= m)
f(m + 1, t2);
else
t2 = m;
if(y2 > x2) {
a -= 1;
b += x2 + y1;
c -= x2 * y1;
}
else if(x2 > y2) {
a -= 1;
b += x1 + y2;
c -= x1 * y2;
}
f(t2 + 1, t);
}
int main() {
scanf("%d", &T);
while(T--) {
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(C, 0, sizeof(C));
scanf("%d", &N);
for(int i = 0; i < N; ++i) {
__int64 x1, y1, x2, y2;
scanf("%I64d%I64d%I64d%I64d", &x1, &y1, &x2, &y2);
insert(x1, y1, x2, y2);
}
for(int i = 1; i < v; ++i) {
A[i] += A[i-1];
B[i] += B[i-1];
C[i] += C[i-1];
}
scanf("%d", &x);
while(x--) {
__int64 t;
scanf("%I64d", &t);
printf("%I64d\n", t * t * A[t] + t * B[t] + C[t]);
}
}
}

144
HDOJ/4534_autoAC.cpp Normal file
View File

@ -0,0 +1,144 @@
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 1605;
const int inf = 0x3f3f3f3f;
int n;
int sz;
char str[105];
int del[2][N][1<<8];
int sco[2][N][1<<8];
struct Ac_auto {
int ch[N][26];
int fail[N];
int sta[N];
int gain[N];
char kill[N];
int idx, root;
int newnd() {
memset(ch[idx], 0, sizeof (ch[idx]));
gain[idx] = sta[idx] = fail[idx] = kill[idx] = 0;
return idx++;
}
void init() {
idx = 0, root = newnd();
}
void insert(char ss[], int val) {
int len = strlen(ss);
int p = root;
for (int i = 0; i < len; ++i) {
char c = ss[i]-'a';
if (!ch[p][c]) ch[p][c] = newnd();
p = ch[p][c];
}
if (val == 999) sta[p] = 1 << sz;
else if (val == -999) kill[p] = 1;
else gain[p] = val;
}
void build() {
queue<int>q;
for (int i = 0; i < 26; ++i) {
if (ch[root][i]) {
q.push(ch[root][i]);
}
}
while (!q.empty()) {
int p = q.front();
q.pop();
for (int i = 0; i < 26; ++i) {
int v = ch[p][i];
int x = fail[p];
if (v) {
q.push(v);
while (x && !ch[x][i]) x = fail[x];
fail[v] = ch[x][i];
kill[v] |= kill[fail[v]];
sta[v] |= sta[fail[v]];
gain[v] += gain[fail[v]];
} else {
ch[p][i] = ch[x][i];
}
}
}
}
};
Ac_auto ac;
void solve() {
memset(del, 0x3f, sizeof (del));
memset(sco, 0x80, sizeof (sco));
int cur = 0, nxt = 1;
del[cur][0][0] = 0;
sco[cur][0][0] = 0;
int len = strlen(str);
int lim = 1 << sz;
const int &idx = ac.idx;
for (int i = 0; i < len; ++i) {
int c = str[i]-'a';
memset(del[nxt], 0x3f, sizeof (del[nxt]));
memset(sco[nxt], 0x80, sizeof (sco[nxt]));
for (int j = 0; j < idx; ++j) {
for (int k = 0; k < lim; ++k) {
if (del[cur][j][k] == inf) continue;
if (del[nxt][j][k] > del[cur][j][k] + 1) {
del[nxt][j][k] = del[cur][j][k] + 1;
sco[nxt][j][k] = sco[cur][j][k];
} else if (del[nxt][j][k] == del[cur][j][k] + 1) {
if (sco[nxt][j][k] < sco[cur][j][k]) {
sco[nxt][j][k] = sco[cur][j][k];
}
}
int np = ac.ch[j][c];
if (ac.kill[np]) continue;
int gain = ac.gain[np];
int nsta = k|ac.sta[np];
if (del[nxt][np][nsta] > del[cur][j][k]) {
del[nxt][np][nsta] = del[cur][j][k];
sco[nxt][np][nsta] = sco[cur][j][k] + gain;
} else if (del[nxt][np][nsta] == del[cur][j][k]) {
if (sco[nxt][np][nsta] < sco[cur][j][k] + gain) {
sco[nxt][np][nsta] = sco[cur][j][k] + gain;
}
}
}
}
swap(cur, nxt);
}
int xdel = inf, xsco;
for (int i = 0; i < idx; ++i) {
if (xdel > del[cur][i][lim-1]) {
xdel = del[cur][i][lim-1];
xsco = sco[cur][i][lim-1];
} else if (xdel == del[cur][i][lim-1]) {
xsco = max(xsco, sco[cur][i][lim-1]);
}
}
if (xdel == inf) {
puts("Banned");
} else {
printf("%d %d\n", xdel, xsco);
}
}
int main() {
int T, ca = 0;
scanf("%d", &T);
while (T--) {
int val;
sz = 0;
ac.init();
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%s %d", str, &val);
ac.insert(str, val);
if (val == 999) ++sz;
}
ac.build();
scanf("%s", str);
printf("Case %d: ", ++ca);
solve();
}
return 0;
}

26
HDOJ/4535_autoAC.cpp Normal file
View File

@ -0,0 +1,26 @@
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN (100+10)
__int64 f[MAXN]={0,0,1};
__int64 h = 1000000007;
int main()
{
int t;
int n;
for (int i=3;i<=100;i++)
{
f[i]=((i-1)*f[i-1]%h+f[i-2]*(i-1)%h)%h;
}
scanf(" %d",&t);
while (t--)
{
scanf(" %d",&n);
printf("%I64d\n",f[n]);
}
}

67
HDOJ/4536_autoAC.cpp Normal file
View File

@ -0,0 +1,67 @@
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 20;
int p[maxn], nervous[maxn], n, m, k, max_cnt;
int att[110][3];
void dfs(int cn) {
if(max_cnt >= k) return ;
if(cn >= k) {
max_cnt = k; return ;
}
int a[3], bak[3];
for(int v=0; v<3; v++) {
a[0] = att[cn][v];
a[1] = att[cn][(v+1)%3];
a[2] = att[cn][(v+2)%3];
bak[0] = nervous[a[0]];
bak[1] = nervous[a[1]];
bak[2] = nervous[a[2]];
nervous[a[0]] -= 2;
if(nervous[a[0]] < 1) nervous[a[0]] = 1;
nervous[a[1]] += 2;
nervous[a[2]] += 2;
for(int i=0; i<n; i++) {
if(p[i] == p[a[1]] && i != a[1]) nervous[i]++;
if(p[i] == p[a[2]] && i != a[2]) nervous[i]++;
}
int flag = true;
for(int i=0; i<n; i++) {
if(nervous[i] > 5) {
max_cnt = max(max_cnt, cn);
flag = false;
}
}
if(flag) dfs(cn+1);
for(int i=0; i<n; i++) {
if(p[i] == p[a[1]] && i != a[1]) nervous[i]--;
if(p[i] == p[a[2]] && i != a[2]) nervous[i]--;
}
nervous[a[0]] = bak[0];
nervous[a[1]] = bak[1];
nervous[a[2]] = bak[2];
}
}
int main(){
int T;
scanf("%d", &T);
for(int kase=1; kase<=T; kase++) {
scanf("%d%d%d", &n, &m, &k);
for(int i=0; i<n; i++) {
scanf("%d", &p[i]);
}
for(int i=0; i<n; i++) {
scanf("%d", &nervous[i]);
}
for(int i=0; i<k; i++) {
scanf("%d %d %d", &att[i][0], &att[i][1], &att[i][2]);
}
max_cnt = 0;
printf("Case #%d: ", kase);
dfs(0);
printf("%d\n", max_cnt);
}
return 0;
}

15
HDOJ/4538_autoAC.cpp Normal file
View File

@ -0,0 +1,15 @@
This is a line with example text
&lt;----&lt;--&lt;-&lt;----&lt;----&lt;-------&lt;---
b b b b b b b
This is a line with example text
&lt;--&lt;--&lt;-&lt;----&lt;----&lt;-------&lt;-----
ge ge ge ge ge ge ge
This is a line with example text
-----&gt;--&gt;-&gt;----&gt;----&gt;-------&gt;--&gt;
w w w w w w w
This is a line with example text
---&gt;--&gt;-&gt;----&gt;----&gt;-------&gt;----&gt;
e e e e e e e
while ((((true)))) printf("Hello VIM!")
------&gt;---&gt;---&gt;----&gt;-------------&gt;--&gt;-&gt;
w w w w W w w

109
HDOJ/4539_autoAC.cpp Normal file
View File

@ -0,0 +1,109 @@
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int N, M, idx;
int sta[175], num[175];
int cnt[15], mp[105];
int f[105][175][175];
void print(int x) {
int rec[50] = {0}, p = 0;
while (x) {
rec[p++] = x % 2;
x /= 2;
}
for (int i = 9; i >= 0; --i) {
printf(i == 0 ? "%d\n" : "%d", rec[i]);
}
}
inline bool legal(int x) {
if (x & (x << 2)) return false;
return true;
}
void init() {
int lim;
idx = 1;
for (int k = 1; k <= 10; ++k) {
lim = 1 << k;
for (int i = 1<<(k-1); i < lim; ++i) {
if (legal(i)) {
sta[idx] = i;
for (int j = 0; j < k; ++j) {
if (i & (1 << j)) ++num[idx];
}
idx++;
}
}
cnt[k] = idx;
}
}
inline bool place(int x, int y) {
return (x & y) == x;
}
inline bool judge_1(int x, int y) {
if ((x << 1) & y || (x >> 1) & y) return false;
return true;
}
inline bool judge_2(int x, int y) {
if (x & y) return false;
return true;
}
int solve() {
int ret = 0;
memset(f, 0, sizeof (f));
if (N == 1) {
for (int i = 0; i < cnt[M]; ++i) {
if (place(sta[i], mp[1])) {
ret = max(ret, num[i]);
}
}
return ret;
}
for (int i = 0; i < cnt[M]; ++i) {
if (!place(sta[i], mp[2])) continue;
for (int j = 0; j < cnt[M]; ++j) {
if (!place(sta[j], mp[1])) continue;
if (judge_1(sta[i], sta[j])) {
f[2][i][j] = num[i] + num[j];
}
}
}
for (int i = 3; i <= N; ++i) {
for (int j = 0; j < cnt[M]; ++j) {
if (!place(sta[j], mp[i])) continue;
for (int k = 0; k < cnt[M]; ++k) {
if (!place(sta[k], mp[i-1]) || !judge_1(sta[j], sta[k])) continue;
for (int h = 0; h < cnt[M]; ++h) {
if (!place(sta[h], mp[i-2]) || !judge_1(sta[k], sta[h])) continue;
if (judge_2(sta[j], sta[h])) {
f[i][j][k] = max(f[i][j][k], f[i-1][k][h] + num[j]);
}
}
}
}
}
for (int i = 0; i < cnt[M]; ++i) {
for (int j = 0; j < cnt[M]; ++j) {
ret = max(ret, f[N][i][j]);
}
}
return ret;
}
int main() {
init();
int c;
while (scanf("%d %d", &N, &M) != EOF) {
memset(mp, 0, sizeof (mp));
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= M; ++j) {
scanf("%d", &c);
mp[i] <<= 1;
mp[i] |= c;
}
}
printf("%d\n", solve());
}
return 0;
}

32
HDOJ/4540_autoAC.cpp Normal file
View File

@ -0,0 +1,32 @@
#include<iostream>
const int inf=1<<30;
using namespace std;
int map[22][22];
int dp[22][22];
int n,m;
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&map[i][j]);
dp[i][j]=inf;
}
}
for(int i=1;i<=m;i++){
dp[1][i]=0;
}
for(int i=2;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=m;k++){
dp[i][j]=min(dp[i][j],dp[i-1][k]+abs(map[i][j]-map[i-1][k]));
}
}
}
int ans=inf;
for(int i=1;i<=m;i++){
ans=min(ans,dp[n][i]);
}
printf("%d\n",ans);
}
return 0;
}

73
HDOJ/4541_autoAC.cpp Normal file
View File

@ -0,0 +1,73 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int s[20][100];
void inite()
{
s[3][0]= 4; s[3][1] = 1, s[3][2] = 2, s[3][3] = 6, s[3][4] = 10;
s[4][0] = 4;s[4][1] = 0, s[4][2] = 4, s[4][3] = 5, s[4][4] = 9;
s[5][0] = 6; s[5][1] = 3, s[5][2] = 7, s[5][3] = 8, s[5][4] = 40;
s[5][5] = 50, s[5][6] = 60;
s[6][0] = 6, s[6][1] = 11, s[6][2] = 12, s[6][3] = 20, s[6][4] = 30;
s[6][5] = 80, s[6][6] = 90;
s[7][0] = 3, s[7][1] = 15, s[7][2] = 16, s[7][3] = 70;
s[8][0] = 13, s[8][1] = 13, s[8][2] = 14, s[8][3] = 18, s[8][4] = 19;
s[8][5] = 41, s[8][6] = 42, s[8][7] = 46, s[8][8] = 51, s[8][9] = 52;
s[8][10] = 56,s[8][11] =61 ,s[8][12] = 62,s[8][13] = 66;
s[9][0] = 22, s[9][1] = 17,s[9][2] = 21, s[9][3] = 22,s[9][4] = 26;
s[9][5] = 31, s[9][6] = 32,s[9][7] = 36, s[9][8] = 44,s[9][9] = 45;
s[9][10] = 49,s[9][11] = 54,s[9][12] = 55, s[9][13] = 59,s[9][14] = 64;
s[9][15] = 65, s[9][16] = 69,s[9][17] = 81, s[9][18] = 82,s[9][19] = 86;
s[9][20] = 91, s[9][21] = 92, s[9][22] = 96;
s[10][0] = 25, s[10][1] = 24,s[10][2] = 25, s[10][3] = 29,s[10][4] = 34;
s[10][5] = 35, s[10][6] = 39,s[10][7] = 43, s[10][8] = 47,s[10][9] = 48;
s[10][10] = 53, s[10][11] = 57,s[10][12] = 58, s[10][13] = 63,s[10][14] = 67;
s[10][15] = 68, s[10][16] = 71,s[10][17] = 72, s[10][18] = 76,s[10][19] = 84;
s[10][20] = 85, s[10][21] = 89,s[10][22] = 94, s[10][23] = 95,s[10][24] = 99;
s[10][25] = 100;
s[11][0] = 15, s[11][1] = 23,s[11][2] = 27,s[11][3] = 28,s[11][4] = 33;
s[11][5] = 37, s[11][6] = 38,s[11][7] = 74,s[11][8] = 75,s[11][9] = 79;
s[11][10] = 83, s[11][11] = 87,s[11][12] = 88,s[11][13] = 93,s[11][14] = 97;
s[11][15] = 98;
s[12][0] = 3,s[12][1] = 73,s[12][2] = 77,s[12][3] = 78;
}
int main()
{
inite();
int T, cas = 0;
for(scanf("%d", &T); T--; )
{
int a, b;
scanf("%d%d", &a, &b);
if((a < 3) || a > 12)
printf("Case #%d: -1\n", ++cas);
else
{
if(((s[a][0] < b) && (a != 9)) || ((a == 9) && (s[a][0] + 4< b)))
printf("Case #%d: -1\n", ++cas);
else
{
if(a == 9)
{
if(b <= 22)
printf("Case #%d: %d\n", ++cas, s[a][b]);
else if(b == 23)
printf("Case #%d: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n", ++cas);
else if(b == 24)
printf("Case #%d: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n", ++cas);
else if(b == 25)
printf("Case #%d: 60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n", ++cas);
else if(b == 26)
printf("Case #%d: 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n", ++cas);
}
else
printf("Case #%d: %d\n", ++cas, s[a][b]);
}
}
}
return 0;
}

112
HDOJ/4542_autoAC.cpp Normal file
View File

@ -0,0 +1,112 @@
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=100000;
int prime[MAXN+1];
void getPrime()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN;i++)
{
if(!prime[i])prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
long long factor[100][2];
int fatCnt;
int getFactors(long long x)
{
fatCnt=0;
long long tmp=x;
for(int i=1;prime[i]<=tmp/prime[i];i++)
{
factor[fatCnt][1]=0;
if(tmp%prime[i]==0)
{
factor[fatCnt][0]=prime[i];
while(tmp%prime[i]==0)
{
factor[fatCnt][1]++;
tmp/=prime[i];
}
fatCnt++;
}
}
if(tmp!=1)
{
factor[fatCnt][0]=tmp;
factor[fatCnt++][1]=1;
}
return fatCnt;
}
const long long INF=(1LL<<62)+1;
int N;
long long ans;
long long a[47787];
void dfs(int i,long long x,int n)
{
if(n>47777)return;
if(x<INF && (a[n]==0||a[n]>x))a[n]=x;
for(int j=1;j<=62;j++)
{
if(INF/prime[i]<x)break;
x*=prime[i];
if(x>=INF)break;
dfs(i+1,x,n*(j+1));
}
}
int get(int x)
{
getFactors(x);
int ans=1;
for(int i=0;i<fatCnt;i++)
ans*=(factor[i][1]+1);
return ans;
}
void solve2()
{
int x=2;
while(x*x<=4*(N+x))
{
if(x==get(N+x))
{
printf("%d\n",N+x);
return;
}
x++;
}
printf("Illegal\n");
}
void init()
{
memset(a,0,sizeof(a));
dfs(1,1,1);
}
int main()
{
int T;
getPrime();
int iCase=0;
scanf("%d",&T);
int Type;
init();
while(T--)
{
iCase++;
scanf("%d%d",&Type,&N);
printf("Case %d: ",iCase);
if(Type==0)
{
if(a[N]!=0)printf("%I64d\n",a[N]);
else printf("INF\n");
}
else solve2();
}
return 0;
}

131
HDOJ/4543_autoAC.cpp Normal file
View File

@ -0,0 +1,131 @@
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
struct P{
int x,y,dis;
};
int N,M,pnum;
int map[80][80],a[80][80];
P queue[100000];
int front,rear;
char s[200];
P point[10000];
void push(P p){
queue[rear++] = p;
}
P pop(){
++front;
return queue[front - 1];
}
P D(P p,int dir){
P p2 = p;
if(dir == 0) --p2.x;
else if(dir == 1) ++ p2.x;
else if(dir == 2) -- p2.y;
else ++p2.y;
return p2;
}
bool check(P p){
if(p.x >=0 && p.x < N && p.y >=0 && p.y < M && a[p.x][p.y] == 0)
return true;
return false;
}
void BFS()
{
rear = front = 0;
for(int i=0; i<N; ++i)
for(int j=0; j<M; ++j){
if(a[i][j] == 1){
P p;
p.x = i;
p.y = j;
push(p);
}
}
while(rear > front){
P p = pop();
for(int dir =0; dir < 4; dir ++){
P p2;
p2 = D(p,dir);
if(check(p2)){
a[p2.x][p2.y] = a[p.x][p.y] + 1;
push(p2);
}
}
}
}
bool cmp(P p1, P p2){
return p1.dis < p2.dis;
}
int DIS(P p1,P p2){
return abs(p1.x - p2.x) + abs(p1.y - p2.y);
}
int solve()
{
BFS();
pnum = 0;
for(int i=0; i<N; ++i){
for(int j=0; j<M; ++j){
if(a[i][j] > 1){
P p;
p.x = i;
p.y = j;
p.dis = a[i][j] - 1;
point[pnum++] = p;
}
}
}
if(pnum == 0){
if(N == 1) return (M-1) / 2;
if(M == 1) return (N-1) / 2;
return (2*N + 2*M - 4)/3;
}
sort(point,point+pnum,cmp);
int q = 0,d = 1;
while(q < pnum){
bool flag = false;
for(int i=q; i<pnum; ++i){
for(int j=i+1;j<pnum; ++j){
if(DIS(point[i],point[j]) < d) continue;
for(int k=j+1; k<pnum; ++k){
if(DIS(point[i],point[k]) >= d &&
DIS(point[j],point[k]) >= d){
flag = true;
break;
}
}
if(flag) break;
}
if(flag) break;
}
if(flag == false) break;
++d;
while(q < pnum && point[q].dis < d){
++q;
}
}
return d-1;
}
int main()
{
int T,cas = 0;
scanf("%d",&T);
while(T--){
++cas;
int ans = 1;
scanf("%d %d",&N,&M);
gets(s);
for(int i=0; i<N; ++i){
gets(s);
for(int j=0; j<M; ++j){
map[i][j] = (s[j] == '.' ? 0 : 1);
a[i][j] = map[i][j];
}
}
ans = solve();
printf("Case %d: %d\n",cas,ans);
}
return 0;
}

65
HDOJ/4544_autoAC.cpp Normal file
View File

@ -0,0 +1,65 @@
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
using namespace std;
typedef long long ll;
typedef __int64 int64;
const int maxn = 2000005;
const int inf = 0x7fffffff;
const double pi=acos(-1.0);
const double eps = 1e-8;
struct node{
int pi,di;
}a[ maxn ];
int cmp( node a,node b ){
if( a.di!=b.di ) return a.di>b.di;
else return a.pi<b.pi;
}
int main(){
int n,m;
while( scanf("%d%d",&n,&m)==2 ){
int cnt = 0;
for( int i=0;i<n;i++ ){
scanf("%d",&a[ i ].di);
a[ i ].pi = -1;
}
cnt = n;
for( int i=0;i<m;i++ ){
scanf("%d",&a[ cnt ].di);
cnt++;
}
cnt = n;
for( int i=0;i<m;i++ ){
scanf("%d",&a[ cnt ].pi);
cnt++;
}
sort( a,a+cnt,cmp );
__int64 ans = 0;
bool flag = true;
int kill = 0;
priority_queue< int,vector<int>,greater<int> > q;
for( int i=0;i<cnt&&kill<n;i++ ){
if( a[ i ].pi<0 ){
if( q.empty() ){
flag = false;
break;
}
ans += q.top();
q.pop();
kill++;
}
else{
q.push( a[ i ].pi );
}
}
if( flag == false ) printf("No\n");
else printf("%I64d\n",ans);
}
return 0;
}

65
HDOJ/4545_autoAC.cpp Normal file
View File

@ -0,0 +1,65 @@
#include<stdio.h>
#include<string.h>
#define N 1005
int main()
{
char s1[N],s2[N];
int mark[27][27];
int i,j;
int flag;
int T;
char x,y;
scanf("%d",&T);
int count=1;
while(T--)
{
getchar();
gets(s1);
gets(s2);
int n;
scanf("%d",&n);
memset(mark,0,sizeof(mark));
while(n--)
{
getchar();
scanf("%c %c",&x,&y);
mark[x-'a'+1][y-'a'+1]=1;
}
int ln1,ln2;
ln1=strlen(s1);
ln2=strlen(s2);
i=0;
j=0;
flag=0;
for(i=0;i<ln1;i++)
{
if(j==ln2)
break;
if(s1[i]==s2[j])
{
j++;
continue;
}
while(s2[j]!=s1[i])
{
if(j==ln2)
{
flag=1;
break;
}
if(mark[s2[j]-'a'+1][s1[i]-'a'+1]==1)
{
j++;
break;
}
else
j++;
}
}
if(!flag)
printf("Case #%d: happy\n",count++);
else
printf("Case #%d: unhappy\n",count++);
}
return 0;
}

52
HDOJ/4546_autoAC.cpp Normal file
View File

@ -0,0 +1,52 @@
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
int n, m;
const int maxn = 10011;
struct Node
{
int sum;
int nex;
int ith;
Node(){}
Node(int sum_, int nex_, int ith_){sum = sum_, nex = nex_, ith = ith_;}
bool operator<(const Node &b)const
{return b.nex < nex;}
};
int a[maxn];
int Cal(int m)
{
priority_queue<Node> q;
Node lin;
lin.sum = 0, lin.nex = a[0], lin.ith = 0;
q.push(lin);
int cnt = 0;
a[n] = 0;
while(cnt < m)
{
lin = q.top(); q.pop();
if(lin.ith >= n) continue;
q.push(Node(lin.sum, lin.sum + a[lin.ith + 1], lin.ith + 1));
q.push(Node(lin.nex, lin.nex + a[lin.ith + 1], lin.ith + 1));
cnt += 1;
}
for(m = 0; !q.empty(); m ++) a[m] = q.top().sum, q.pop();
sort(a, a + m);
return a[m - 1];
}
int main()
{
int i, t, ca;
for(scanf("%d", &t), ca = 1; ca <= t; ca ++)
{
scanf("%d%d", &n, &m);
for(i = 0; i < n; i ++)
scanf("%d", &a[i]);
sort(a, a + n);
printf("Case #%d: %d\n", ca, Cal(m));
}
return 0;
}

128
HDOJ/4547_autoAC.cpp Normal file
View File

@ -0,0 +1,128 @@
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
#include <cstring>
using namespace std;
const int MAX_ = 400010;
map<string,int>mp;
struct point {
int to,next, num;
} edge[MAX_], qedge[MAX_];
struct query {
int u,v,lca;
} q[MAX_];
int V[MAX_], head[MAX_], d[MAX_], fa[MAX_], ind[MAX_];
bool vis[MAX_];
int M,L, T;
int n, m;
void adde(int from,int to,int c) {
edge[M].to = to;
edge[M].num = c;
edge[M].next = V[from];
V[from] = M++;
}
void addq(int from,int to,int c) {
qedge[L].to = to;
qedge[L].num = c;
qedge[L].next = head[from];
head[from] = L++;
}
int find(int x) {
if(fa[x] == x)return fa[x];
else return fa[x] = find(fa[x]);
}
void dfs(int k,int pri,int x) {
d[x] = k;
for(int i = V[x]; i != -1; i = edge[i].next) {
if(edge[i].to != pri) {
dfs(k+1,x,edge[i].to);
}
}
}
void tarjan(int x) {
fa[x] = x;
vis[x] = 1;
for(int i = V[x]; i != -1; i = edge[i].next) {
if(!vis[edge[i].to]) {
tarjan(edge[i].to);
fa[edge[i].to] = x;
}
}
for(int i = head[x]; i != -1; i = qedge[i].next) {
if(vis[qedge[i].to]) {
q[qedge[i].num].lca = find(qedge[i].to);
}
}
}
void solve() {
for(int i = 1; i <= n; i++) {
if(ind[i] == 0) {
dfs(0,-1,i);
tarjan(i);
break;
}
}
}
int capture(char s[]) {
if(mp.find(s) == mp.end()) {
return mp[s] = ++T;
} else return mp[s];
}
void init() {
memset(V,-1,sizeof(V));
memset(head,-1,sizeof(head));
memset(ind,0,sizeof(ind));
memset(vis,0,sizeof(vis));
M = L = T = 0;
mp.clear();
for(int i = 0; i <= n; i++) {
fa[i] = i;
}
}
void read() {
int s,t;
char c1[50],c2[50];
for(int i = 1; i < n; i++) {
scanf("%s",c1);
scanf("%s",c2);
t = capture(c1);
s = capture(c2);
adde(s,t,1);
adde(t,s,1);
ind[t]++;
}
for(int i = 0; i < m; i++) {
scanf("%s",c1);
scanf("%s",c2);
t = capture(c1);
s = capture(c2);
addq(s,t,i);
addq(t,s,i);
q[i].u = t;
q[i].v = s;
}
}
void print_ans() {
for(int i = 0; i < m; i++) {
int t;
t = d[q[i].u] - d[q[i].lca];
if(q[i].v != q[i].lca) {
t++;
}
if(q[i].u == q[i].v) t = 0;
printf("%d\n",t);
}
}
int main() {
int Case;
scanf("%d",&Case);
while(Case--) {
scanf("%d%d",&n,&m);
init();
read();
solve();
print_ans();
}
return 0;
}

56
HDOJ/4548_autoAC.cpp Normal file
View File

@ -0,0 +1,56 @@
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool mark[1000010];
int num[1000010];
int k;
int Judge(int n){
int ans=0;
while(n){
ans+=n%10;
n/=10;
}
return ans;
}
void IsPrime(){
memset(mark,true,sizeof(mark));
mark[0]=mark[1]=false;
k=0;
for(int i=2;i*i<1000000;i++){
if(mark[i]){
for(int j=i*i;j<1000000;j+=i)
mark[j]=false;
}
}
for(int i=2;i<=1000010;i++){
if(mark[i]&&mark[Judge(i)]){
num[++k]=i;
}
}
}
int Binary_Search(int l,int h,int number){
while(l<=h){
int mid=(l+h)/2;
if(num[mid]==number)return mid;
else if(num[mid]>number)h=mid-1;
else l=mid+1;
}
return l;
}
int main(){
IsPrime();
int _case,n,m,t=1;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
int cnt=0;
int pos1=Binary_Search(1,k,n);
int pos2=Binary_Search(1,k,m);
pos1--;
if(num[pos2]==m)pos2++;
cnt=pos2-pos1-1;
printf("Case #%d: %d\n",t++,cnt);
}
return 0;
}

70
HDOJ/4549_autoAC.cpp Normal file
View File

@ -0,0 +1,70 @@
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
const int MOD=1e9+7;
struct Matrix
{
long long mat[2][2];
};
Matrix mul(Matrix a,Matrix b)
{
Matrix ret;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
ret.mat[i][j]=0;
for(int k=0;k<2;k++)
{
ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
ret.mat[i][j]%=(MOD-1);
}
}
return ret;
}
Matrix pow_M(Matrix a,int n)
{
Matrix ret;
memset(ret.mat,0,sizeof(ret.mat));
ret.mat[0][0]=ret.mat[1][1]=1;
Matrix temp=a;
while(n)
{
if(n&1)ret=mul(ret,temp);
temp=mul(temp,temp);
n>>=1;
}
return ret;
}
long long pow_m(long long a,long long n)
{
long long ret=1;
long long temp=a%MOD;
while(n)
{
if(n&1)
{
ret*=temp;
ret%=MOD;
}
temp*=temp;
temp%=MOD;
n>>=1;
}
return ret;
}
int main()
{
int a,b,n;
Matrix tmp;
tmp.mat[0][0]=0;
tmp.mat[0][1]=tmp.mat[1][0]=tmp.mat[1][1]=1;
while(scanf("%d%d%d",&a,&b,&n)==3)
{
Matrix p=pow_M(tmp,n);
int ans=(pow_m(a,p.mat[0][0])*pow_m(b,p.mat[1][0]))%MOD;
printf("%d\n",ans);
}
return 0;
}

39
HDOJ/4550_autoAC.cpp Normal file
View File

@ -0,0 +1,39 @@
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;
const int MAXN=110;
char str[MAXN];
char sta1[MAXN],sta2[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",&str);
int n=strlen(str);
int t1=0,t2=0;
int t=n-1;
while(t>0 && str[t]=='0')t--;
for(int i=t;i>=0;i--)
if(str[i]!='0'&&str[i]<str[t])
t=i;
sta1[t1++]=str[t];
for(int i=n-1;i>t;i--)sta2[t2++]=str[i];
while(t1+t2<n && t>0)
{
int tmp=t-1;
for(int j=tmp-1;j>=0;j--)
if(str[j]<str[tmp])
tmp=j;
sta1[t1++]=str[tmp];
for(int i=t-1;i>tmp;i--)sta2[t2++]=str[i];
t=tmp;
}
for(int i=0;i<t1;i++)printf("%c",sta1[i]);
for(int i=t2-1;i>=0;i--)printf("%c",sta2[i]);
printf("\n");
}
}

48
HDOJ/4551_autoAC.cpp Normal file
View File

@ -0,0 +1,48 @@
#include <iostream>
#include <stdio.h>
using namespace std;
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
bool run_year(int z)
{
if((z%4==0&&z%100!=0)||(z%400==0))
return true;
else
return false;
}
int month[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
int T,num=0;
scanf("%d",&T);
while(T--)
{
num++;
int x,y,z;
int fx,fy;
int a,b;
scanf("%d%d%d",&a,&b,&z);
int ans=0;
for(x=1;x<=12;x++)
{
for(y=1;y<=month[x];y++)
{
int g=gcd(x,y);
if(a==g&&(b==(x*y)/g))
{
if(x==2&&y==29&&!run_year(z)) continue;
ans++;
fx=x;fy=y;
}
}
}
if(ans==0) printf("Case #%d: -1\n",num);
else if(ans==1) printf("Case #%d: %04d/%02d/%02d\n",num,z,fx,fy);
else
printf("Case #%d: 1\n",num);
}
return 0;
}

196
HDOJ/4553_autoAC.cpp Normal file
View File

@ -0,0 +1,196 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int L = 100000+10;
struct node
{
int d,n,s;
int ls,rs,ms;
int nsl,nsr,nsm;
} a[L<<2];
void diaosi(int l,int r,int i)
{
a[i].d = 1;
a[i].ls = a[i].rs = a[i].ms = 0;
}
void nvshen(int l,int r,int i)
{
a[i].n = 1;
a[i].d = 0;
a[i].ls = a[i].rs = a[i].ms = 0;
a[i].nsl = a[i].nsr = a[i].nsm = 0;
}
void xuexi(int l,int r,int i)
{
a[i].s = 1;
a[i].d = a[i].n = 0;
a[i].ls = a[i].rs = a[i].ms = r-l+1;
a[i].nsl = a[i].nsr = a[i].nsm = r-l+1;
}
void pushup(int l,int r,int i)
{
int mid = (l+r)>>1;
a[i].ms = max(a[2*i].ms,a[2*i+1].ms);
a[i].ms = max(a[i].ms,a[2*i].rs+a[2*i+1].ls);
a[i].ls = a[2*i].ls;
a[i].rs = a[2*i+1].rs;
if(a[2*i].ls == mid-l+1)
a[i].ls+=a[2*i+1].ls;
if(a[2*i+1].rs == r-mid)
a[i].rs+= a[2*i].rs;
a[i].nsm = max(a[2*i].nsm,a[2*i+1].nsm);
a[i].nsm = max(a[i].nsm,a[2*i].nsr+a[2*i+1].nsl);
a[i].nsl = a[2*i].nsl;
a[i].nsr = a[2*i+1].nsr;
if(a[2*i].nsl == mid-l+1)
a[i].nsl+=a[2*i+1].nsl;
if(a[2*i+1].nsr == r-mid)
a[i].nsr+= a[2*i].nsr;
}
void pushdown(int l,int r,int i)
{
int mid = (l+r)>>1;
if(a[i].s)
{
xuexi(l,mid,2*i);
xuexi(mid+1,r,2*i+1);
a[i].s = 0;
}
if(a[i].d)
{
diaosi(l,mid,2*i);
diaosi(mid+1,r,2*i+1);
a[i].d = 0;
}
if(a[i].n)
{
nvshen(l,mid,2*i);
nvshen(mid+1,r,2*i+1);
a[i].n = 0;
}
}
void study(int L,int R,int l,int r,int i)
{
if(L == l && R == r)
{
xuexi(l,r,i);
return ;
}
int mid = (l+r)>>1;
pushdown(l,r,i);
if(R<=mid)
study(L,R,l,mid,2*i);
else if(L>mid)
study(L,R,mid+1,r,2*i+1);
else
{
study(L,mid,l,mid,2*i);
study(mid+1,R,mid+1,r,2*i+1);
}
pushup(l,r,i);
}
void insert(int flag,int L,int R,int l,int r,int i)
{
if(l == L && r == R)
{
if(!flag)
diaosi(l,r,i);
else
nvshen(l,r,i);
return ;
}
int mid = (l+r)>>1;
pushdown(l,r,i);
if(R<=mid)
insert(flag,L,R,l,mid,2*i);
else if(L>mid)
insert(flag,L,R,mid+1,r,2*i+1);
else
{
insert(flag,L,mid,l,mid,2*i);
insert(flag,mid+1,R,mid+1,r,2*i+1);
}
pushup(l,r,i);
}
int query(int flag,int t,int l,int r,int i)
{
if(l==r)
return l;
int mid = (l+r)>>1;
pushdown(l,r,i);
if(!flag)
{
if(a[2*i].ms>=t)
return query(flag,t,l,mid,2*i);
else if(a[2*i].rs+a[2*i+1].ls>=t)
return mid-a[2*i].rs+1;
else
return query(flag,t,mid+1,r,2*i+1);
}
else
{
if(a[2*i].nsm>=t)
return query(flag,t,l,mid,2*i);
else if(a[2*i].nsr+a[2*i+1].nsl>=t)
return mid-a[2*i].nsr+1;
else
return query(flag,t,mid+1,r,2*i+1);
}
}
int main()
{
int t,i,x,y,ans,cas = 1,n,m;
char str[20];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
printf("Case %d:\n",cas++);
study(1,n,1,n,1);
while(m--)
{
scanf("%s",str);
if(str[0] == 'D')
{
scanf("%d",&x);
if(a[1].ms<x)
printf("fly with yourself\n");
else
{
ans = query(0,x,1,n,1);
insert(0,ans,ans+x-1,1,n,1);
printf("%d,let's fly\n",ans);
}
}
else if(str[0] == 'N')
{
scanf("%d",&x);
if(a[1].ms<x)
{
if(a[1].nsm<x)
printf("wait for me\n");
else
{
ans = query(1,x,1,n,1);
insert(1,ans,ans+x-1,1,n,1);
printf("%d,don't put my gezi\n",ans);
}
}
else
{
ans = query(0,x,1,n,1);
insert(1,ans,ans+x-1,1,n,1);
printf("%d,don't put my gezi\n",ans);
}
}
else
{
scanf("%d%d",&x,&y);
study(x,y,1,n,1);
printf("I am the hope of chinese chengxuyuan!!\n");
}
}
}
return 0;
}

41
HDOJ/4554_autoAC.cpp Normal file
View File

@ -0,0 +1,41 @@
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
int numa[11],numb[11];
int main()
{
int T,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&a,&b);
int x=(a+b)/2;
int y=a-x;
int coua=0,coub=0;
int ita=abs(x);
int itb=abs(y);
while(ita)
{
numa[coua++]=ita%10;
ita/=10;
}
while(itb)
{
numb[coub++]=itb%10;
itb/=10;
}
int xx=0,yy=0;
for(int i=0;i<coua;i++)
xx=xx*10+numa[i];
for(int i=0;i<coub;i++)
yy=yy*10+numb[i];
if(x<0)
xx=-xx;
if(y<0)
yy=-yy;
printf("%d %d\n",xx+yy,xx-yy);
}
return 0;
}

33
HDOJ/4556_autoAC.cpp Normal file
View File

@ -0,0 +1,33 @@
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1000011;
int n;
long long ans[maxn],phi[maxn];
void Phi(int n)
{
phi[1]=1;
for(int i=2;i<=n;i++)
if(!phi[i])
for(int j=i;j<=n;j+=i)
{
if(!phi[j])
phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
int main()
{
Phi(maxn-1);
ans[1]=2;
ans[2]=3;
for(int i=3;i<maxn;i++)
ans[i]=ans[i-1]+phi[i];
while(scanf("%d",&n)!=EOF)
{
long long s=(ans[n]-2)*2+3;
printf("%I64d\n",s);
}
return 0;
}

60
HDOJ/4557_autoAC.cpp Normal file
View File

@ -0,0 +1,60 @@
#include<iostream>
#include<list>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
string name;
int grade;
int time;
node(string s,int a,int b):name(s),grade(a),time(b){}
friend bool operator<(const node& a,const node& b)
{
if(a.grade!=b.grade)
return a.grade<b.grade;
else return a.time<b.time;
}
friend bool operator==(const node& a,const node& b)
{
return a.grade>=b.grade;
}
};
int main()
{
int cas,n,num;
cin>>cas;
string op,name;
int time;
for(int c=1;c<=cas;c++)
{
cin>>n;printf("Case #%d:\n",c);
list<node>li;
time=1;
for(int i=0;i<n;i++)
{
cin>>op;
if(op[0]=='A')
{
cin>>name>>num;
li.push_back(node(name,num,i));
li.sort();
cout<<li.size()<<endl;
}
else
{
cin>>num;
list<node>::iterator iter=find(li.begin(),li.end(),node("",num,0));
if(iter!=li.end())
{
cout<<iter->name<<endl;
li.erase(iter);
}
else
{
cout<<"WAIT..."<<endl;
}
}
}
}
}

50
HDOJ/4558_autoAC.cpp Normal file
View File

@ -0,0 +1,50 @@
#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
#define MP make_pair
#define SQ(x) ((x)*(x))
typedef long long int64;
const double PI = acos(-1.0);
const int MAXN = 110;
const int INF = 0x3f3f3f3f;
using namespace std;
const int MOD = 1000000007;
int n, m;
int f[2][480][22][2];
int mat[480][480];
char str[1000];
int main(){
int nCase, cas=1;
scanf("%d", &nCase);
while(nCase--){
scanf("%d%d%*c", &n, &m);
for(int i=1; i<=n; ++i){
gets(str);
for(int j=1; j<=m; ++j)
mat[i][j] = str[j-1]-'0';
}
memset(f, 0, sizeof(f));
int ans = 0;
bool p = 0;
for(int i=1; i<=n; ++i){
p = !p;
memset(f[p], 0, sizeof(f[p]));
for(int j=1; j<=m; ++j){
for(int k=0; k<=10; ++k){
int x1 = (k+mat[i][j])%11;
int x2 = (k-mat[i][j]+11)%11;
f[p][j][k][0] += ((f[!p][j][x1][1]+f[p][j-1][x1][1])%MOD)%MOD;
f[p][j][k][1] += ((f[!p][j][x2][0]+f[p][j-1][x2][0])%MOD)%MOD;
}
++f[p][j][11-mat[i][j]][0];
}
for(int j=1; j<=m; ++j){
ans += (f[p][j][0][0] + f[p][j][0][1])%MOD;
ans %= MOD;
}
}
printf("Case %d: %d\n",cas++, ans);
}
return 0;
}

54
HDOJ/4559_autoAC.cpp Normal file
View File

@ -0,0 +1,54 @@
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 5000
using namespace std;
int an[2][MAX],sg[MAX];
bool vis[MAX];
int getsg(int x)
{
int i;
if(sg[x]>=0) return sg[x];
memset(vis,0,sizeof(vis));
for(i=0;i<=x-i-1;i++)
vis[getsg(i)^getsg(x-i-1)^1]=1;
for(i=0;i<=x-i-2;i++)
vis[getsg(i)^getsg(x-i-2)]=1;
i=0;
while(vis[i]) i++;
return sg[x]=i;
}
int main(){
int t,m,n,s,c,ans,i,k=0,len;
memset(sg,-1,sizeof(sg));
sg[0]=0;
for(i=1;i<=4747;i++) sg[i]=getsg(i);
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
memset(an,0,sizeof(an));
for(i=0;i<m;i++){
scanf("%d %d",&s,&c);
an[s-1][c-1]=1;
}
ans=0;len=0;
for(i=0;i<n;i++){
if(an[0][i]||an[1][i]){
ans^=sg[len];
ans^=an[0][i];
ans^=an[1][i];
len=0;
}
else len++;
}
ans^=sg[len];
printf("Case %d: %s\n",++k,ans?"Alice":"Bob");
}
return 0;
}

104
HDOJ/4560_autoAC.cpp Normal file
View File

@ -0,0 +1,104 @@
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
const int MAXN=1100;
int maze[MAXN][MAXN];
int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN];
int flow[MAXN][MAXN];
int sap(int start,int end,int nodenum)
{
memset(cur,0,sizeof(cur));
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
memset(flow,0,sizeof(flow));
int u=pre[start]=start,maxflow=0,aug=-1;
gap[0]=nodenum;
while(dis[start]<nodenum)
{
loop:
for(int v=cur[u];v<nodenum;v++)
if(maze[u][v]-flow[u][v] && dis[u]==dis[v]+1)
{
if(aug==-1 || aug>maze[u][v]-flow[u][v])aug=maze[u][v]-flow[u][v];
pre[v]=u;
u=cur[u]=v;
if(v==end)
{
maxflow+=aug;
for(u=pre[u];v!=start;v=u,u=pre[u])
{
flow[u][v]+=aug;
flow[v][u]-=aug;
}
aug=-1;
}
goto loop;
}
int mindis=nodenum-1;
for(int v=0;v<nodenum;v++)
if(maze[u][v]-flow[u][v]&&mindis>dis[v])
{
cur[u]=v;
mindis=dis[v];
}
if((--gap[dis[u]])==0)break;
gap[dis[u]=mindis+1]++;
u=pre[u];
}
return maxflow;
}
bool used[MAXN][MAXN];
int main()
{
int T;
int N,M,L,K;
scanf("%d",&T);
int iCase=0;
while(T--)
{
iCase++;
scanf("%d%d%d%d",&N,&M,&L,&K);
memset(maze,0,sizeof(maze));
int u,v;
memset(used,false,sizeof(used));
while(L--)
{
scanf("%d%d",&u,&v);
used[u][v]=true;
}
for(int i=N+1;i<=N+M;i++)maze[i][i+M]=K;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
if(used[i][j])
{
maze[i][j+N+M]=1;
}
else maze[i][j+N]=1;
}
int ans=0;
int l=0,r=M;
while(l<=r)
{
int mid=(l+r)/2;
for(int i=1;i<=N;i++)maze[0][i]=mid;
for(int i=N+M+1;i<=N+2*M;i++)maze[i][N+2*M+1]=mid;
if(sap(0,N+2*M+1,N+2*M+2)==mid*N)
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("Case %d: %d\n",iCase,ans);
}
return 0;
}

72
HDOJ/4561_autoAC.cpp Normal file
View File

@ -0,0 +1,72 @@
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int tCase,n,a[10000+1];
int num[10000+1];
int z,f,o;
int solve(int s,int t)
{
f=0;
for(int i=s;i<t;i++)
{
if(a[i]<0) f++;
}
if(f%2==0)
{
return t-s;
}
else
{
int ans=0,tag1=s-1,tag2=t,a1,a2,a3,a4,m=t-s;
for(int i=s;i<t;i++)
{
if(a[i]<0)
{
tag1=i;
break;
}
}
a1=m-(tag1-s+1);
a3=tag1-s;
if(a1<a3) a1=a3;
for(int i=t-1;i>=s;i--)
{
if(a[i]<0)
{
tag2=i;
break;
}
}
a2=tag2-s;
a4=t-1-tag2;
if(a2<a4) a2=a4;
ans=max(ans,max(a1,a2));
return ans;
}
}
int main()
{
scanf("%d",&tCase);
for(int i=1;i<=tCase;i++)
{
scanf("%d",&n);
o=0;
for(int j=1;j<=n;j++)
{
scanf("%d",&a[j]);
if(a[j]==0)
num[o++]=j;
}
num[o++]=n+1;
int t=1;
int ans=0;
for(int j=0;j<o;j++)
{
ans=max(ans,solve(t,num[j]));
t=num[j]+1;
}
printf("Case #%d: %d\n",i,ans);
}
return 0;
}

99
HDOJ/4562_autoAC.cpp Normal file
View File

@ -0,0 +1,99 @@
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <string>
#include <math.h>
using namespace std;
const int MAXN=1010;
struct Node
{
int x,y;
int r;
};
bool cmp(Node a,Node b)
{
return a.r<b.r;
}
int dis2(Node a,Node b)
{
return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
Node node[MAXN];
Node node1[MAXN];
Node node2[MAXN];
int dp1[MAXN];
int dp2[MAXN];
int main()
{
int T;
int n;
int iCase=0;
Node st;
st.x=0;st.y=0;
Node ed;
scanf("%d",&T);
while(T--)
{
iCase++;
printf("Case %d: ",iCase);
scanf("%d",&n);
scanf("%d%d",&ed.x,&ed.y);
int t1=0;
int t2=0;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].r);
int d1=dis2(st,node[i]);
int d2=dis2(ed,node[i]);
if(d1==node[i].r*node[i].r||d2==node[i].r*node[i].r)
continue;
if(d1<node[i].r*node[i].r&&d2<node[i].r*node[i].r)continue;
if(d1>node[i].r*node[i].r&&d2>node[i].r*node[i].r)continue;
if(d1<node[i].r*node[i].r)
{
node1[t1++]=node[i];
}
else node2[t2++]=node[i];
}
sort(node1,node1+t1,cmp);
sort(node2,node2+t2,cmp);
int ans1=0,ans2=0;
for(int i=0;i<t1;i++)
{
dp1[i]=1;
for(int j=0;j<i;j++)
{
int d=dis2(node1[i],node1[j]);
if(node1[i].r>node1[j].r && d<(node1[i].r-node1[j].r)*(node1[i].r-node1[j].r))
dp1[i]=max(dp1[i],dp1[j]+1);
}
ans1=max(ans1,dp1[i]);
}
for(int i=0;i<t2;i++)
{
dp2[i]=1;
for(int j=0;j<i;j++)
{
int d=dis2(node2[i],node2[j]);
if( node2[i].r>node2[j].r && d<(node2[i].r-node2[j].r)*(node2[i].r-node2[j].r))
dp2[i]=max(dp2[i],dp2[j]+1);
}
ans2=max(ans2,dp2[i]);
}
int ans=max(ans1,ans2);
for(int i=0;i<t1;i++)
for(int j=0;j<t2;j++)
{
int d1=dis2(node1[i],node2[j]);
if(d1>(node1[i].r+node2[j].r)*(node1[i].r+node2[j].r))
ans=max(ans,dp1[i]+dp2[j]);
}
printf("%d\n",ans);
}
return 0;
}

72
HDOJ/4563_autoAC.cpp Normal file
View File

@ -0,0 +1,72 @@
#include <algorithm>
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
#define N 100010
#define E 100010
#define ll long long
const int INF =0x3fffffff;
const int PRIME =999983;
const int MOD =1000000007;
const int MULTI =1000000007;
const double EPS=1e-8;
#define CUBE(x) ((x)*(x)*(x))
#define SQ(x) ((x)*(x))
#define ALL(x) x.begin(),x.end()
#define CLR(x,a) memset(x,a,sizeof(x))
#define maxAry(a,n) max_element(a,a+(n))
#define minAry(a,n) min_element(a,a+(n))
inline bool isodd(int x){return x&1;}
inline bool isodd(ll x) {return x&1;}
double dp[110];
int vx[110],vy[110];
int n,L;
double gao(int x)
{
fill(dp,dp+L+1,-1);
dp[0]=0;
for(int i=0;i<n;i++){
if(i==x) continue;
for(int j=L;j>=0;j--){
for(int k=0;k<=100;k++){
if(j-vx[i]*k<0 || dp[j-vx[i]*k]==-1) continue;
if(dp[j]==-1) dp[j]=dp[j-vx[i]*k]+vy[i]*k-0.5*9.8*SQ(k);
else dp[j]=max(dp[j],dp[j-vx[i]*k]+vy[i]*k-0.5*9.8*SQ(k));
}
}
}
double ans=-INF;
for(int i=0;i<=L;i++){
if(dp[i]==-1) continue;
double t=1.0*(L-i)/vx[x];
ans=max(ans,dp[i]+vy[x]*t-0.5*9.8*SQ(t));
}
return ans;
}
int main()
{
int re,Case=1;
double ans;
scanf("%d",&re);
while(re--){
scanf("%d%d",&n,&L);
for(int i=0;i<n;i++)
scanf("%d%d",&vx[i],&vy[i]);
ans=-INF;
for(int i=0;i<n;i++)
ans=max(ans,gao(i));
printf("Case %d: %.3lf\n",Case++,ans);
}
return 0;
}

24
HDOJ/4565_autoAC.cpp Normal file
View File

@ -0,0 +1,24 @@
#include <cstdio>
typedef long long llg;
llg a,b,n,m;
void solve(){
llg ans1(1),ans2(0),t1(a),t2(1);
llg tmp;
while(n){
if(n&1){
tmp = ans1;
ans1 = (ans1*t1+ans2*t2*b)%m;
ans2 = (tmp*t2+ans2*t1)%m;
}
tmp = t1;
t1 = (t1*t1+t2*t2*b)%m;
t2 = 2*tmp*t2%m;
n >>= 1;
}
printf("%lld\n",ans1*2%m);
}
int main(){
while(~scanf("%lld%lld%lld%lld",&a,&b,&n,&m))
solve();
return 0;
}

106
HDOJ/4566_autoAC.cpp Normal file
View File

@ -0,0 +1,106 @@
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <bitset>
#include <vector>
#include <ctime>
using namespace std;
typedef long long LL;
const int N = 100000;
const int M = 50;
const LL MAXS = 1LL<<50;
const LL MAXT = (LL)1e16;
inline LL two( int x ) { return 1LL<<x; }
LL f[M+1][N+5], g[M+1][N+5], a[N+5];
int ran[2][2][N+5];
int n , m;
LL s;
void solve( LL t , LL &ans1, LL &ans2) {
fill( f[0], f[0]+n+1, 0 );
fill( g[0], g[0]+n+1, 0 );
f[0][0] = 1;
int bits[55], bitt[55];
for( int i = 0 ; i < m; ++i ) {
bits[i] = (s&two(i))>0;
bitt[i] = (t&two(i))>0;
}
ran[0][0][0] = n;
ran[0][1][0] = 0;
for( int i = 1; i <= n; ++i ) {
ran[0][0][i] = i-1;
}
for( int i = 1; i <= m; ++i ) {
int cur = i&1, pre = cur^1 ;
fill( f[i], f[i]+n+1, 0 );
fill( g[i], g[i]+n+1, 0 );
for( int j = 0 ; j < 2; ++j ) ran[cur][j][0] = 0;
for( int j = 1 ; j >= 0; --j ) {
for( int k = 1 ; k <= ran[pre][j][0]; ++k ) {
int idx = ran[pre][j][k];
if( a[idx] & two(i-1) ) ran[cur][1][ ++ran[cur][1][0] ] = idx ;
else ran[cur][0][ ++ran[cur][0][0] ] = idx ;
}
}
int oneCnt = 0, curOnes = ran[cur][1][0], curZeros = ran[cur][0][0];
for( int j = 0; j <= n; ++j ) {
int idx = -1, presize1 = ran[pre][1][0];
if( j > presize1 ) {
idx = ran[pre][0][j-presize1];
} else {
if( j > 0 ) idx = ran[pre][1][j];
}
if( idx != -1 && (a[idx]&two(i-1)) != 0 ) {
++oneCnt;
}
int tBit = bitt[i-1];
int curOne = curOnes + j - 2*oneCnt;
if( (curOne&1) == bits[i-1] ) {
if( tBit == 0 ) {
f[i][ oneCnt ] += f[i-1][j];
g[i][ oneCnt ] += g[i-1][j];
} else {
f[i][ oneCnt ] += f[i-1][j]+g[i-1][j];
}
}
curOne = curZeros - j + 2*oneCnt;
int nextOne = j + curOnes - oneCnt;
if( (curOne&1) == bits[i-1] ) {
if( tBit == 0 ) {
g[i][ nextOne ] += g[i-1][j] + f[i-1][j];
} else {
f[i][ nextOne] += f[i-1][j];
g[i][ nextOne] += g[i-1][j];
}
}
}
}
ans1 = ans2 = 0;
for( int i = 0 ; i <= n; ++i ) {
ans1 += f[m][i];
ans2 += g[m][i];
}
ans2 += ans1;
return ;
}
int main() {
LL t;
int start = clock();
while( scanf("%d%d%lld%lld",&n,&m,&s,&t) != EOF ) {
if( t > MAXT ) {
cerr<<t<<" "<<MAXT<<endl;
}
LL x = 0;
for( int i = 0 ; i < n; ++i ) {
scanf("%lld",&a[i]);
x ^= a[i];
}
LL M = 1LL << m, loops = t/M;
LL ans1, ans2;
solve( t%M ,ans1, ans2);
loops *= ans2;
loops += ans1;
if( x == s ) loops--;
printf("%lld\n", loops);
}
return 0;
}

34
HDOJ/4567_autoAC.cpp Normal file
View File

@ -0,0 +1,34 @@
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
__int64 l[1000005],v[1000005],r;
int main()
{
__int64 n,i,j,k,b;
int t=0;
while(~scanf("%I64d",&n))
{
t++;
if(t>=40) continue;
memset(l,0,sizeof l);
for(i=1;i<=n;i++)
{
scanf("%I64d",&v[i]);
l[i]=l[i-1]+v[i]+1;
if(l[i-1]<=v[i]) k=i;
}
for(i=k+1,r=0,b=0;i<=n;i++)
{
b+=(v[i]<=b);
r+=max(0ll,v[i]-b);
}
if((r+l[k-1])==v[k]) printf("%I64d\n",k);
else if((r+l[k-1])>v[k]) printf("Unknown\n");
else printf("Bad Rescue\n");
}
return 0;
}

92
HDOJ/4568_autoAC.cpp Normal file
View File

@ -0,0 +1,92 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 222
#define inf 1<<30
struct Point{
int x,y;
}point[MAXN];
int value[MAXN][MAXN];
int map[MAXN][MAXN];
int dist[MAXN][MAXN];
int dd[MAXN];
bool mark[MAXN][MAXN];
int dp[1<<14][14];
int n,m,k;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void spfa(int num)
{
memset(mark,false,sizeof(mark));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)dist[i][j]=inf;
queue<pair<int,int> >que;
que.push(make_pair(point[num].x,point[num].y));
if(dist[point[num].x][point[num].y]==-1)return;
dist[point[num].x][point[num].y]=0;
while(!que.empty()){
int x=que.front().first,y=que.front().second;
que.pop();
mark[x][y]=false;
if(x==0||x==(n-1)||y==0||y==(m-1)){
dd[num]=min(dd[num],dist[x][y]);
}
for(int i=0;i<4;i++){
int xx=x+dir[i][0],yy=y+dir[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&value[xx][yy]!=-1){
if(dist[x][y]+value[xx][yy]<dist[xx][yy]){
dist[xx][yy]=dist[x][y]+value[xx][yy];
if(!mark[xx][yy]){
mark[xx][yy]=true;
que.push(make_pair(xx,yy));
}
}
}
}
}
}
int main()
{
int _case;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&value[i][j]);
scanf("%d",&k);
for(int i=0;i<k;i++)scanf("%d%d",&point[i].x,&point[i].y);
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
map[i][j]=(i==j)?0:inf;
for(int i=0;i<(1<<k);i++)
for(int j=0;j<k;j++)dp[i][j]=inf;
fill(dd,dd+MAXN,inf);
for(int i=0;i<k;i++){
spfa(i);
for(int j=0;j<k;j++){
if(i==j)continue;
map[i][j]=min(map[i][j],dist[point[j].x][point[j].y]);
}
dp[1<<i][i]=dd[i]+value[point[i].x][point[i].y];
}
for(int s=0;s<(1<<k);s++){
for(int i=0;i<k;i++){
if(s&(1<<i)==0)continue;
if(dp[s][i]==inf)continue;
for(int j=0;j<k;j++){
if(s&(1<<j)==1)continue;
dp[s|(1<<j)][j]=min(dp[s|(1<<j)][j],dp[s][i]+map[i][j]);
}
}
}
int ans=inf;
for(int i=0;i<k;i++){
ans=min(ans,dp[(1<<k)-1][i]+dd[i]);
}
printf("%d\n",ans);
}
return 0;
}

51
HDOJ/4569_autoAC.cpp Normal file
View File

@ -0,0 +1,51 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
int a[5], pri, n;
__int64 f(int x,int i)
{
int j;
__int64 sum=0;
for(j=0;j<i;j++){
sum = (sum+a[j])*x;
}
return sum+a[j];
}
void solve()
{
int i, j, k;
int pri2 = pri*pri;
for(i=0;i<pri;i++)
{
if( (f(i,n))%pri==0 ){
for(j=i;j<pri2;j+=pri)
{
if( f(j,n)%pri2==0 ){
printf("%d\n",j);
return;
}
}
}
}
printf("No solution!\n");
}
int main()
{
int cse;
cin>>cse;
for(int t=1;t<=cse;t++)
{
scanf("%d",&n);
for(int i=0;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&pri);
printf("Case #%d: ",t);
solve();
}
return 0;
}

45
HDOJ/4570_autoAC.cpp Normal file
View File

@ -0,0 +1,45 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n;
__int64 dp[70][70],a[70],sum[70];
__int64 pow(__int64 n)
{
__int64 ans= 1;
int i;
for(i = 1; i<=n; i++)
ans*=2;
return ans;
}
int main()
{
int t,i,j,k,s;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(sum,0,sizeof(sum));
for(i = 1; i<=n; i++)
{
scanf("%I64d",&a[i]);
sum[i] = sum[i-1]+a[i];
}
memset(dp,0,sizeof(dp));
for(s = 0; s<=n; s++)
{
for(i = 1; i<=n && i+s<=n; i++)
{
j = i+s;
if(s<=19)
dp[i][j] =a[i]*pow(j-i)*2;
else
dp[i][j] = (sum[j]-sum[i-1])*2;
for(k = i; k<=j; k++)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
printf("%I64d\n",dp[1][n]);
}
return 0;
}

102
HDOJ/4571_autoAC.cpp Normal file
View File

@ -0,0 +1,102 @@
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=110;
const int oo=0x3fffffff;
int S[maxn], C[maxn];
int mp[maxn], visit[maxn][3*maxn];
int map[maxn][maxn], cap[maxn][maxn], dis[maxn][3*maxn];
int n, m, V, T, st, sd, ss, dd;
struct node
{
int u, t;
};
void floyd()
{
ss=n, dd=n+1, S[dd]=0;
for(int k=0; k<n; k++)
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j];
for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++)
{
if(map[i][j]!=oo)
{
if(S[i]<S[j]) cap[i][j]=map[i][j]+C[j];
if(S[j]<S[i]) cap[j][i]=map[i][j]+C[i];
}
}
cap[ss][st]=C[st];
for(int i=0; i<n; i++)
if(i!=st&&map[st][i]!=oo) cap[ss][i]=map[st][i]+C[i];
for(int i=0; i<n; i++)
if(i!=sd&&map[i][sd]!=oo) cap[i][dd]=map[i][sd];
}
int spfa()
{
queue<node>q;
for(int i=0; i<=n+1; i++)
for(int j=0; j<=V; j++) dis[i][j]=-oo, visit[i][j]=0;
node s, p;
s.u=ss, s.t=0;
q.push(s);
dis[ss][0]=0;
visit[ss][0]=1;
while(!q.empty())
{
p=q.front();
q.pop();
visit[p.u][p.t]=0;
for(int i=0; i<=n+1; i++)
{
if(p.u!=i&&cap[p.u][i]!=oo)
{
int tp=p.t+cap[p.u][i];
if(tp<=V&&dis[i][tp]<dis[p.u][p.t]+S[i])
{
dis[i][tp]=dis[p.u][p.t]+S[i];
s.u=i, s.t=tp;
if(!visit[s.u][s.t]) visit[s.u][s.t]=1,q.push(s);
}
}
}
}
int maxx=0;
for(int i=0; i<=V; i++)
{
maxx=max(maxx,dis[sd][i]);
maxx=max(maxx,dis[dd][i]);
}
return maxx;
}
int main()
{
cin >> T;
for(int tcase=1; tcase<=T; tcase++)
{
scanf("%d%d%d%d%d",&n,&m,&V,&st,&sd);
for(int i=0; i<=n+1; i++)
for(int j=0; j<=n+1; j++)
{
map[i][j]=oo, cap[i][j]=oo;
if(i==j) map[i][j]=cap[i][j]=0;
}
for(int i=0; i<n; i++) scanf("%d",C+i);
for(int i=0; i<n; i++) scanf("%d",S+i);
while(m--)
{
int u, v, val;
scanf("%d%d%d",&u,&v,&val);
map[u][v]=min(map[u][v],val);
map[v][u]=min(map[v][u],val);
}
floyd();
int ans=spfa();
printf("Case #%d:\n%d\n",tcase,ans);
}
return 0;
}

14
HDOJ/4572_autoAC.cpp Normal file
View File

@ -0,0 +1,14 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int main()
{
int N,M;
while(scanf("%d%d",&M,&N)!=EOF)
{
printf("%d\n",(M+(M-(N-1)/2)+1)*(N-1)/4+(M+(M-(N+1)/2)+1)*(N+1)/4);
}
return 0;
}

121
HDOJ/4573_autoAC.cpp Normal file
View File

@ -0,0 +1,121 @@
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define db double
#define rt return
#define cs const
#define cp const P&
#define op operator
cs db eps = 1e-9;
inline int sig(db x){rt (x>eps)-(x<-eps);}
cs int N = 10001;
struct P {
db x, y, z;
P(db a = 0, db b = 0, db c = 0):x(a),y(b),z(c){}
void in(){scanf("%lf%lf%lf", &x, &y, &z);}
P op+(cp a)cs{rt P(x+a.x, y+a.y, z+a.z);}
P op-(cp a)cs{rt P(x-a.x, y-a.y, z-a.z);}
P op*(cs db&k)cs{rt P(x*k, y*k, z*k);}
P op^(cp a)cs{rt P(y*a.z-a.y*z, z*a.x-a.z*x, x*a.y-a.x*y);}
db op*(cp a)cs{rt x*a.x + y*a.y + z*a.z;}
P cross(P a, P b){rt a-*this ^ b-*this;}
db dot(P a, P b){rt (a-*this) * (b-*this);}
db L(){rt sqrt(x*x + y*y + z*z);}
db V6(P b, P c){rt (b ^ c) * (*this);}
}p[N];
int n;
db diff_vol, max_diff;
struct convex {
int cnt, blg[N][N];
struct face {
int a, b, c, is;
face(int x=0,int y=0,int z=0,int w=0):a(x),b(y),c(z),is(w){}
int visible(P me) {
rt sig(p[a].cross(p[b],p[c]) * (me-p[a])) > 0;
}
}fac[N*10];
int col(int a, int b, int c){rt p[a].cross(p[b],p[c]).L() < eps;}
int cop(int a, int b, int c, int d){rt !sig(p[a].cross(p[b],p[c])*(p[d]-p[a]));}
void deal(int k, int a, int b) {
int f = blg[a][b];
if(fac[f].is) {
if(fac[f].visible(p[k])) dfs(k, f);
else {
diff_vol += p[b].V6(p[a], p[k]);
face add = face(b, a, k, 1);
blg[b][a] = blg[a][k] = blg[k][b] = cnt;
fac[cnt++] = add;
}
}
}
void dfs(int k, int cur) {
diff_vol -= p[fac[cur].a].V6(p[fac[cur].b], p[fac[cur].c]);
fac[cur].is = 0;
deal(k, fac[cur].b, fac[cur].a);
deal(k, fac[cur].c, fac[cur].b);
deal(k, fac[cur].a, fac[cur].c);
}
void init() {
cnt = 0;
for(int i = 0; i < 4; i++) {
face add = face((i+1)%4, (i+2)%4, (i+3)%4, 1);
if(add.visible(p[i])) swap(add.b, add.c);
blg[add.a][add.b] = blg[add.b][add.c] = blg[add.c][add.a] = cnt;
fac[cnt++] = add;
}
}
void update(int k) {
for(int i = 0; i < cnt; i++)
if(fac[i].is && fac[i].visible(p[k])) {
dfs(k, i); break;
}
}
db volume() {
db v = 0.;
for(int i = 0; i < cnt; i++)
v += fac[i].is * p[fac[i].a].V6(p[fac[i].b], p[fac[i].c]);
rt v / 6.;
}
}hull;
void solve(int number, int cas) {
max_diff = 0.;
int king = 1, tag = 1;
p[0].in();
for(int i = 1; i < number; i++) {
p[i].in();
if(tag == 1) {
tag += sig((p[0]-p[i]).L());
if(tag > 1) swap(p[1], p[i]);
continue;
}
if(tag == 2) {
tag += sig((p[0].cross(p[1], p[i])).L());
if(tag > 2) swap(p[2], p[i]);
continue;
}
if(tag == 3) {
tag += sig(p[0].cross(p[1], p[2]) * (p[i]-p[0])) != 0;
if(tag > 3) {
swap(p[3], p[i]);
hull.init();
for(int j = 4; j <= i; j++) hull.update(j);
king = i + 1, max_diff = hull.volume();
}
continue;
}
diff_vol = 0.;
hull.update(i);
diff_vol /= 6.;
if(sig(diff_vol - max_diff) > 0) {
max_diff = diff_vol;
king = i + 1;
}
}
printf("Case #%d:\n%d %.2lf\n", cas, king, max_diff);
}
int main() {
int number, cas = 1;
while(scanf("%d", &number) != -1) solve(number, cas++);
rt 0;
}

84
HDOJ/4574_autoAC.cpp Normal file
View File

@ -0,0 +1,84 @@
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#define mp(a , b) make_pair(a , b)
using namespace std;
typedef long long LL;
const LL inf = 1000000000LL;
int a , b , l , r , k;
int pow (int a , int b) {
int ret = 1;
for (int i = 0 ; i < b ; i ++) {
ret = ret * a;
if (ret > inf || ret <= 0)
return inf + 1;
}
return ret;
}
int gao (int c , int a , int b , int l , int r , int k) {
if (c == 0) return l <= r;
if (c == 1) {
if (l > r) return 0;
return max (0 , min(r , b) - max (l , a) + 1);
}
int down = max(a , l / pow(b , c - 1));
int up = min (b , r / pow(a , c - 1));
int ret = 0;
for (int i = down ; i <= up ; i ++) {
ret += gao (c - 1 , i , b , (l + i - 1) / i , r / i , k - ret);
if (ret > k) return ret;
}
return ret;
}
int ret , ans[50];
void fuck (int c , int a , int b , int l , int r , int k) {
if (c == 0) return;
if (c == 1) {
int num = k + max(l , a) - 1;
ret = ret * num;
ans[c] = num;
return ;
}
int down = max(a , l / pow(b , c - 1));
int up = min (b , r / pow(a , c - 1));
for (int i = down ; i <= up ; i ++) {
int cnt = gao (c - 1 , i , b , (l + i - 1) / i , r / i , k);
if (k > cnt) {
k -= cnt;
continue;
}
ret = ret * i;
ans[c] = i;
fuck (c - 1 , i , b , (l + i - 1) / i , r / i , k);
return ;
}
}
int main () {
int t , cas = 0;
scanf ("%d" , &t);
while (t --) {
bool ok = false;
scanf ("%d %d %d %d %d" , &a , &b , &l , &r , &k);
printf ("Case #%d: " , ++ cas);
for (int i = 1 ; i <= 30 ; i ++) {
int cnt = gao (i , a , b , l , r , k);
if (k > cnt) {
k -= cnt;
continue;
}
ret = 1;
fuck (i , a , b , l , r , k);
printf ("%d\n" , ret);
for (int j = i ; j >= 1 ; j --) {
printf ("%d%c" , ans[j] , j == 1 ? '\n' : ' ');
}
ok = true;
break;
}
if (!ok) puts("-1");
}
return 0;
}

196
HDOJ/4575_autoAC.cpp Normal file
View File

@ -0,0 +1,196 @@
#include <iostream>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <map>
using namespace std;
#define inf 9e99
#define eps 1e-9
#define x first
#define y second
#define pb push_back
#define sz(a) int(a.size())
#define rep(i,a,b) for(int i=a;i<=b;i++)
template<class T> inline void gmin(T&a,T b) {if(a>b)a=b;}
template<class T> inline T sqr(T a) {return a*a;}
#define N 20020
vector<int> to[N],len[N];
int col[N],n;
double sum[N],L;
#define is_leaf(x) sz(to[x])==1 && sum[to[x][0]]<sum[x]
void pre_dfs(int x) {
rep(i,0,sz(to[x])-1) {
int y=to[x][i];
if (sum[y]<0) {
col[y]=x==1?y:col[x];
sum[y]=sum[x]+len[x][i];
pre_dfs(y);
}
}
}
vector<int> path,tmp[N];
double dp1[N],ans1[N];
double dp2[N],ans2[N];
double Y1(int j) {return dp1[j]+sqrt(dp1[j])+sqr(sum[j])+2.0*sum[j]*L;}
double Y2(int j) {return dp2[j]+sqrt(dp2[j])+sqr(sum[j])-2.0*sum[j]*L;}
double slope1(int j,int k) {return (Y1(j)-Y1(k))/(sum[j]-sum[k]);}
double slope2(int j,int k) {return (Y2(j)-Y2(k))/(sum[j]-sum[k]);}
double calc(double Ej,double sum) {return Ej+sqrt(Ej)+sum*sum;}
struct Queue {
map<double,int> q;
void clear() {q.clear();}
int size() {return q.size();}
int front() {return sz(q)?q.begin()->y:0;}
int front2() {return sz(q)?(++q.begin())->y:0;}
int back() {return sz(q)?q.rbegin()->y:0;}
int back2() {return sz(q)?(++q.rbegin())->y:0;}
void pop_front() {q.erase(q.begin());}
void pop_back() {q.erase(--q.end());}
void insert(int x,int y) {q[x]=y;}
void merge(Queue *b) {
while (b->size()) {
int cur=b->front();
b->pop_front();
if (q.find(sum[cur])!=q.end()) {
int j=cur,k=q[sum[cur]];
if (Y2(j)>=Y2(k)) continue;
}
q[sum[cur]]=cur;
if (sz(q)<=2) continue;
map<double,int>::iterator i=q.find(sum[cur]),l1,l2,r1,r2;
if (i!=q.begin() && i!=(--q.end())) {
l1=i, l1--;
r1=i, r1++;
if (slope2(l1->y,i->y)>=slope2(i->y,r1->y)) {
q.erase(i);
continue;
}
}
while (i!=q.begin() && i!=(++q.begin())) {
l1=i, l1--;
l2=l1, l2--;
if (slope2(l2->y,l1->y)<=slope2(l1->y,i->y)) break;
q.erase(l1);
}
while (i!=(--q.end()) && i!=(--(--q.end()))) {
r1=i, r1++;
r2=r1, r2++;
if (slope2(i->y,r1->y)<=slope2(r1->y,r2->y)) break;
q.erase(r1);
}
}
}
} q1,*q2[N];
void first_run(int x) {
rep(i,0,sz(to[x])-1) {
int y=to[x][i];
if (sum[y]<=sum[x]) continue;
path.pb(y);
tmp[x].clear();
while (sz(q1)>=2 && slope1(q1.front(),q1.front2())<=2.0*sum[y] ) {
tmp[x].pb(q1.front());
q1.pop_front();
}
dp1[y]=calc(dp1[q1.front()],sum[y]-sum[q1.front()]-L);
while (sz(q1)>=2 && slope1(q1.back2(),q1.back())>=slope1(q1.back(),y) ) {
tmp[x].pb(q1.back());
q1.pop_back();
}
q1.insert(sum[y],y);
first_run(y);
q1.pop_back();
rep(i,0,sz(tmp[x])-1)
q1.insert(sum[tmp[x][i]],tmp[x][i]);
path.pop_back();
}
if (is_leaf(x)) {
gmin(ans1[col[x]],dp1[x]);
}
}
void merge(Queue *&a,Queue *&b) {
if (b->size() < a->size()) {
a->merge(b);
} else {
b->merge(a);
a=b;
}
}
double get_val(Queue *q,int x) {
while (q->size()>=2 && slope2(q->back(),q->back2())>=2.0*sum[x]) q->pop_back();
dp2[x]=calc(dp2[q->back()],sum[q->back()]-sum[x]-L);
while (q->size()>=2 && slope2(q->front2(),q->front())<=slope2(q->front(),x) ) q->pop_front();
return dp2[x];
}
void second_run(int x) {
q2[x]=new Queue;
rep(i,0,sz(to[x])-1){
int y=to[x][i];
if (sum[y]<=sum[x]) continue;
second_run(y);
if (x==1) {
gmin(ans2[y],get_val(q2[y],x));
} else {
merge(q2[x],q2[y]);
}
}
if (x!=1) {
dp2[x]=is_leaf(x)?0:get_val(q2[x],x);
q2[x]->insert(sum[x],x);
}
}
double get_answer() {
vector<int> part;
rep(i,2,n) if (col[i]==i) part.pb(i);
double min1=inf,min2=inf;
int pos1;
rep(i,0,sz(part)-1) {
if (min1>ans2[part[i]]) {
min2=min1;
min1=ans2[part[i]];
pos1=i;
} else
if (min2>ans2[part[i]]) {
min2=ans2[part[i]];
}
}
double res=inf;
rep(i,0,sz(part)-1)
gmin(res,ans1[part[i]]+(pos1==i?min2:min1));
return res;
}
int main() {
while (~scanf("%d%lf",&n,&L)) {
rep(i,1,n) {
to[i].clear();
len[i].clear();
}
rep(i,1,n-1) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
to[u].pb(v);
to[v].pb(u);
len[u].pb(w);
len[v].pb(w);
}
if (sz(to[1])<2) {
puts("-1");
continue;
}
fill(sum+2,sum+n+1,-1);
pre_dfs(1);
fill(dp1+2,dp1+n+1,inf);
fill(dp2+1,dp2+n+1,inf);
fill(ans1,ans1+n+1,inf);
fill(ans2,ans2+n+1,inf);
path.clear();
path.pb(1);
q1.clear();
q1.insert(0,1);
first_run(1);
second_run(1);
printf("%.2lf\n",get_answer());
}
return 0;
}

34
HDOJ/4576_autoAC.cpp Normal file
View File

@ -0,0 +1,34 @@
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=220;
int n,m,l,r;
double dp[2][N];
int main(){
while(~scanf("%d%d%d%d",&n,&m,&l,&r)){
if(n==0 && m==0 && l==0 && r==0)
break;
for(int i=0;i<=n;i++)
dp[0][i]=0;
dp[0][0]=1;
int x,cur=0;
while(m--){
scanf("%d",&x);
for(int i=0;i<n;i++)
dp[cur^1][i]=0;
for(int i=0;i<n;i++){
if(dp[cur][i]==0)
continue;
dp[cur^1][((i-x)%n+n)%n]+=0.5*dp[cur][i];
dp[cur^1][(i+x)%n]+=0.5*dp[cur][i];
}
cur^=1;
}
double ans=0;
for(int i=l-1;i<r;i++)
ans+=dp[cur][i];
printf("%.4lf\n",ans);
}
return 0;
}

147
HDOJ/4578_autoAC.cpp Normal file
View File

@ -0,0 +1,147 @@
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define lz 2*u,l,mid
#define rz 2*u+1,mid+1,r
typedef long long lld;
const int maxn=100005;
const int mod=10007;
lld add[4*maxn], mul[4*maxn], ch[4*maxn], sum[4*maxn];
void build(int u, int l, int r)
{
mul[u]=1;
add[u]=sum[u]=0;
ch[u]=0;
if(l==r)
{
ch[u]=1;
return ;
}
int mid=(l+r)>>1;
build(lz);
build(rz);
}
void push_down(int u, int l, int r)
{
if(l==r) return ;
int mid=(l+r)>>1;
if(ch[u])
{
add[2*u]=0, mul[2*u]=1;
add[2*u+1]=0, mul[2*u+1]=1;
ch[2*u]=ch[2*u+1]=1;
sum[2*u]=sum[2*u+1]=sum[u];
ch[u]=0;
}
else
{
if(add[u])
{
if(ch[2*u]) sum[2*u]=(sum[2*u]+add[u])%mod;
else
{
push_down(lz);
add[2*u]=(add[2*u]+add[u])%mod;
}
if(ch[2*u+1]) sum[2*u+1]=(sum[2*u+1]+add[u])%mod;
else
{
push_down(rz);
add[2*u+1]=(add[2*u+1]+add[u])%mod;
}
add[u]=0;
}
if(mul[u]>1)
{
if(ch[2*u]) sum[2*u]=(sum[2*u]*mul[u])%mod;
else
{
push_down(lz);
mul[2*u]=(mul[2*u]*mul[u])%mod;
}
if(ch[2*u+1]) sum[2*u+1]=(sum[2*u+1]*mul[u])%mod;
else
{
push_down(rz);
mul[2*u+1]=(mul[2*u+1]*mul[u])%mod;
}
mul[u]=1;
}
}
}
void Update(int u, int l, int r, int tl, int tr, int c, int op)
{
if(tl<=l&&r<=tr)
{
if(op==3)
{
ch[u]=1;
mul[u]=1, add[u]=0;
sum[u]=c;
}
else
{
if(ch[u])
{
if(op==1) sum[u]=(sum[u]+c)%mod;
else sum[u]=sum[u]*c%mod;
}
else
{
push_down(u,l,r);
if(op==1) add[u]=(add[u]+c)%mod;
else mul[u]=mul[u]*c%mod;
}
}
return ;
}
push_down(u,l,r);
int mid=(l+r)>>1;
if(tr<=mid) Update(lz,tl,tr,c,op);
else if(tl>mid) Update(rz,tl,tr,c,op);
else
{
Update(lz,tl,mid,c,op);
Update(rz,mid+1,tr,c,op);
}
}
lld Query(int u, int l, int r, int tl, int tr, int p)
{
if(tl<=l&&r<=tr)
{
if(ch[u])
{
lld ans=1, tp=sum[u];
for(int i=1; i<=p; i++) ans=ans*tp%mod;
return (r-l+1)*ans%mod;
}
}
push_down(u,l,r);
int mid=(l+r)>>1;
if(tr<=mid) return Query(lz,tl,tr,p);
else if(tl>mid) return Query(rz,tl,tr,p);
else
{
lld t1=Query(lz,tl,mid,p);
lld t2=Query(rz,mid+1,tr,p);
return (t1+t2)%mod;
}
}
int main()
{
int n, m;
while(cin >> n >> m, n+m)
{
build(1,1,n);
for(int i=1; i<=m; i++)
{
int l, r, c, op;
scanf("%d%d%d%d",&op,&l,&r,&c);
if(op<=3) Update(1,1,n,l,r,c,op);
else printf("%I64d\n",Query(1,1,n,l,r,c)%mod);
}
}
return 0;
}

76
HDOJ/4579_autoAC.cpp Normal file
View File

@ -0,0 +1,76 @@
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
const int MAXN = 50010;
double c[MAXN][10];
double p[MAXN][20];
double a[MAXN][10];
double b[MAXN];
double dp[MAXN];
int main()
{
int n,m;
while( scanf("%d%d",&n,&m) == 2 )
{
if(n == 0 && m == 0)break;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
scanf("%lf",&c[i][j]);
for(int i = 1;i < n;i++)
{
double sum = 0;
for(int j = 1;j <= m;j++)
sum += c[i][j];
double s = 0;
for(int j = 1;j <= m && i-j >= 1;j++)
{
p[i][m-j] = 0.3*c[i][j]/(1+sum);
s += p[i][m-j];
}
for(int j = 1;j <= m && i+j <= n;j++)
{
p[i][m+j] = 0.7*c[i][j]/(1+sum);
s += p[i][m+j];
}
p[i][m] = -s;
b[i] = -1;
}
for(int i = 1;i <= m+1 && i <= n;i++)
a[1][i] = p[1][m+i-1];
for(int i = 2;i < n;i++)
{
int end = min(i+m,n);
int start = max(1,i-m);
for(int j = start;j < i;j++)
if(fabs(p[i][m+j-i]) > 1e-6)
{
double t = p[i][m+j-i]/a[j][1];
for(int k = 1; k <= m+1 && j+k-1 <= n ;k++)
{
p[i][m+j-i+k-1] -= t*a[j][k];
}
b[i] -= t*b[j];
}
for(int j = 1;j <= end-i+1;j++)
a[i][j] = p[i][m+j-1];
}
dp[n] = 0;
for(int i = n-1;i >= 1;i--)
{
for(int j = 2;j <= m+1 && i+j-1 <= n;j++)
b[i] -= dp[i+j-1] * a[i][j];
dp[i] = b[i]/a[i][1];
}
printf("%.2f\n",dp[1]);
}
return 0;
}

51
HDOJ/4582_autoAC.cpp Normal file
View File

@ -0,0 +1,51 @@
#include <bitset>
#include <iostream>
using namespace std;
const int maxn=2013;
int first[maxn],pre[maxn],vv[maxn*20],nxt[maxn*20];
bitset<2001> to[2001];
bool vis[maxn];
int ans;
void dfs(int u,int p)
{
vis[u]=true;
to[u].reset();
for(int e=pre[u];e;e=nxt[e]) if(vis[vv[e]])
to[u].set(vv[e]);
for(int e=first[u];e;e=nxt[e]) if(vv[e]!=p)
dfs(vv[e],u);
if(p==-1)
return;
if(to[u].test(p))
ans++;
else
to[p]|=to[u];
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m) && n|m)
{
memset(vis,0,sizeof(vis));
memset(first,0,sizeof(first));
memset(pre,0,sizeof(pre));
int e=2;
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
nxt[e]=first[u],vv[e]=v,first[u]=e++;
nxt[e]=first[v],vv[e]=u,first[v]=e++;
}
for(int i=n;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
nxt[e]=pre[u],vv[e]=v,pre[u]=e++;
nxt[e]=pre[v],vv[e]=u,pre[v]=e++;
}
ans=0;
dfs(1,-1);
printf("%d\n",ans);
}
}

60
HDOJ/4583_autoAC.cpp Normal file
View File

@ -0,0 +1,60 @@
#include <iostream>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define LL long long
#define Bool bitset<maxn>
const int maxn=60;
int a[maxn];
Bool to[maxn];
LL num[maxn];
LL ans;
bool gcd(int a,int b)
{
return b==0?a!=1:gcd(b,a%b);
}
LL DFS(int n,Bool p)
{
if(n==-1)
return 1;
LL res=DFS(n-1,p);
if(p.test(n))
return res;
if((p|to[n])==p)
return res*num[n];
else
return res+DFS(n-1,(p|to[n]))*(num[n]-1);
}
int main()
{
int n;
while(~scanf("%d",&n) && n)
{
for(int i=0;i<n;i++)
scanf("%d",a+i);
sort(a,a+n);
int m=0;
num[0]=2;
for(int i=1;i<n;i++)
{
if(a[i]==a[m])
num[m]++;
else
{
a[++m]=a[i];
num[m]=2;
}
}
for(int i=0;i<=m;i++)
{
to[i].reset();
for(int j=0;j<i;j++)
if(gcd(a[j],a[i]))
to[i].set(j);
}
ans=0;
Bool p;
printf("%I64d\n",DFS(m,p));
}
}

58
HDOJ/4584_autoAC.cpp Normal file
View File

@ -0,0 +1,58 @@
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
struct Point
{
int x,y;
Point(int _x = 0,int _y = 0)
{
x = _x; y = _y;
}
};
int dis(Point a,Point b)
{
return abs(a.x-b.x)+abs(a.y-b.y);
}
Point p1[2000];
Point p2[2000];
char str[50][50];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) == 2)
{
if(n == 0 && m == 0)break;
for(int i = 0;i < n;i++)
scanf("%s",str[i]);
int uN = 0, vN = 0;
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
{
if(str[i][j] == 'H')p1[uN++] = Point(i,j);
else if(str[i][j] == 'C') p2[vN++] = Point(i,j);
}
int ans1 = 0,ans2 = 0;
int Min = 100000000;
for(int i = 0;i < uN;i++)
for(int j = 0;j < vN;j++)
{
if(dis(p1[i],p2[j]) < Min)
{
Min = dis(p1[i],p2[j]);
ans1 = i;
ans2 = j;
}
}
printf("%d %d %d %d\n",p1[ans1].x,p1[ans1].y,p2[ans2].x,p2[ans2].y);
}
return 0;
}

28
HDOJ/4585_autoAC.cpp Normal file
View File

@ -0,0 +1,28 @@
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
int n, id, p;
while(cin >> n,n)
{
map<int,int>mp;
mp[1000000000]=1;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&id,&p);
map<int,int>::iterator it=mp.lower_bound(p);
if(it==mp.begin()) cout << id << " " << it->second <<endl;
else
{
map<int,int>::iterator a=it, b=--it;
if((a->first)-p>=p-(b->first))cout << id << " " << b->second <<endl;
else cout << id << " " << a->second <<endl;
}
mp[p]=id;
}
}
return 0;
}

53
HDOJ/4586_autoAC.cpp Normal file
View File

@ -0,0 +1,53 @@
#include <stdio.h>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)
using namespace std;
int n,m;
int vis[210];
int a[210];
int sum,cnt;
double p,q;
int main()
{
while(~scanf("%d",&n))
{
sum = 0;
cnt = 0;
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i];
}
p = (sum*1.0)/n;
scanf("%d",&m);
int x;
for(int i = 1; i <= m; i++)
{
cin >> x;
if(vis[x]) continue;
cnt++;
vis[x] = 1;
}
q = (cnt*1.0)/n;
if(fabs(p) < eps)
cout << "0.00" << endl;
else if(fabs(q-1) < eps)
cout << "inf" << endl;
else
printf("%.2lf\n",p/(1-q));
}
return 0;
}

70
HDOJ/4587_autoAC.cpp Normal file
View File

@ -0,0 +1,70 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
#define MAXN 5555
struct Edge{
int v,next;
}edge[MAXN*MAXN];
int n,m,NE;
int head[MAXN];
void Insert(int u,int v)
{
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE++;
}
int cnt,rt_son,block;
int low[MAXN],dfn[MAXN];
int blocks[MAXN];
bool mark[MAXN];
void Tarjan(int u,int vv)
{
low[u]=dfn[u]=++cnt;
mark[u]=true;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(v==vv)continue;
if(dfn[v]==0){
Tarjan(v,vv);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
blocks[u]++;
}
}else if(mark[v]){
low[u]=min(low[u],dfn[v]);
}
}
}
int main()
{
int u,v,ans;
while(~scanf("%d%d",&n,&m)){
NE=0;
memset(head,-1,sizeof(head));
while(m--){
scanf("%d%d",&u,&v);
Insert(u,v);
Insert(v,u);
}
ans=0;
for(int u=0;u<n;u++){
memset(mark,false,sizeof(mark));
memset(dfn,0,sizeof(dfn));
fill(blocks,blocks+n,1);
cnt=block=0;
for(int v=0;v<n;v++)if(u!=v&&!mark[v]){
block++;
blocks[v]=0;
Tarjan(v,u);
}
for(int v=0;v<n;v++)if(v!=u){
ans=max(ans,block+blocks[v]-1);
}
}
printf("%d\n",ans);
}
return 0;
}

44
HDOJ/4588_autoAC.cpp Normal file
View File

@ -0,0 +1,44 @@
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 40;
ll ti[N], p[N], q[N];
void cat (ll x, ll* a) {
if (x <= 0) return;
ll ans = 0, s = 0;
for (int i = 0; i <= 32; i++) {
ll t = ti[i+1];
ll c = x/t, d = x%t;
d -= ti[i];
a[i] = c * ti[i] + (d <= 0 ? 0 : d);
}
}
ll solve () {
ll ans = 0, s = 0;
for (int i = 0; i <= 32; i++) {
s = s + p[i] - q[i];
s /= 2;
ans += s;
}
while (s) {
s /= 2;
ans += s;
}
return ans;
}
int main () {
ti[0] = 1;
for (int i = 1; i <= 35; i++)
ti[i] = ti[i-1] * 2;
ll a, b;
while (cin >> a >> b) {
memset(p, 0, sizeof(p));
memset(q, 0, sizeof(q));
cat (b+1, p);
cat (a, q);
cout << solve () << endl;
}
return 0;
}

27
HDOJ/4593_autoAC.cpp Normal file
View File

@ -0,0 +1,27 @@
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 10010;
int cnt[maxn];
int main()
{
int n;
while(scanf("%d", &n) == 1)
{
memset(cnt, 0, sizeof(cnt));
int ans = -1;
for(int i = 0; i < n+1; i++)
{
int tmp;
scanf("%d", &tmp);
cnt[tmp]++;
if(cnt[tmp] >= 2)
ans = tmp;
}
printf("%d\n", ans);
}
}

210
HDOJ/4594_autoAC.cpp Normal file
View File

@ -0,0 +1,210 @@
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<iostream>
#include<string>
using namespace std;
typedef long long ll;
int T,t,n,m;
map<string,string> match[4];
char str[1010],str2[1010],s1[1010],s2[1010];
int type1,type2,Err,Over;
void init()
{
int i,j,k;
for(i=0;i<=3;i++)
match[i].clear();
Err=1;
Over=0;
}
bool Has_Equal()
{
int i,j,k,len=strlen(str);
bool flag=0,flag2=0;
for(i=0;i<len;i++)
{
if(str[i]==34)
flag2=1;
if(str[i]=='=' && flag2==0)
{
flag=true;
str[i]=' ';
}
if(str[i]==9)
str[i]=32;
}
return flag;
}
bool kong()
{
int i,j,k,len=strlen(str);
bool flag=0;
for(i=0;i<len;i++)
if(!(str[i]==' ' || str[i]==9))
return false;
return true;
}
void solve()
{
int i,j,k,len=strlen(str);
m=0;
for(i=0;i<len;i++)
if(str[i]==34)
break;
m=i;
for(i=m;i<len;i++)
if(!(str[i]==' ' || str[i]==9))
str[m++]=str[i];
str[m]='\0';
}
int main()
{
int i,j,k,pos;
string string1,string2;
scanf("%d",&T);
for(t=1;t<=T;t++)
{
if(t!=1)
printf("\n");
scanf("%d",&n);
getchar();
init();
while(n--)
{
gets(str);
solve();
if(Over==1)
continue;
if(kong())
continue;
if(Has_Equal())
{
sscanf(str,"%s %s",s1,s2);
if(s1[0]=='$')
type1=0;
else
type1=1;
if(s2[0]!=34)
type2=0;
else
type2=1;
if(type1==0)
{
match[0].erase(s1);
match[1].erase(s1);
match[type2][s1]=s2;
}
else
{
if(match[2].find(s1)==match[2].end() && match[3].find(s1)==match[3].end())
match[2+type2][s1]=s2;
else if(Err==1)
printf("WARNING: Constant %s Already Defined!\n",s1);
}
}
else
{
sscanf(str,"%s %s",s1,s2);
if(s1[0]=='P' && s1[1]=='a') //Panic
{
printf("Script was KILLED.\n");
Over=1;
}
else if(s1[0]=='E' && s2[1]=='N') //Errmsg ON
Err=1;
else if(s1[0]=='E' && s2[1]=='F') //Errmsg OFF
Err=0;
else if(s1[0]=='P') //Print
{
if(s2[0]=='$')
{
if(match[0].find(s2)!=match[0].end())
{
string1=match[0][s2];
cout<<string1<<endl;
}
else if(match[1].find(s2)!=match[1].end())
{
string1=match[1][s2];
string2=string1.substr(1,string1.length()-2);
cout<<string2<<endl;
}
else
{
printf("NULL\n");
if(Err==1)
printf("NOTICE: Undefined Variable %s.\n",s2);
}
}
else
{
if(match[2].find(s2)!=match[2].end())
{
string1=match[2][s2];
cout<<string1<<endl;
}
else if(match[3].find(s2)!=match[3].end())
{
string1=match[3][s2];
string2=string1.substr(1,string1.length()-2);
cout<<string2<<endl;
}
else
{
printf("%s\n",s2);
if(Err==1)
printf("NOTICE: Undefined Constant %s.\n",s2);
}
}
}
else if(s1[0]=='D') //Dump
{
if(s2[0]=='$')
{
if(match[0].find(s2)!=match[0].end())
{
string1=match[0][s2];
printf("integer: ");
cout<<string1<<endl;
}
else if(match[1].find(s2)!=match[1].end())
{
string1=match[1][s2];
printf("string: ");
cout<<string1<<endl;
}
else
{
printf("NULL\n");
if(Err==1)
printf("NOTICE: Undefined Variable %s.\n",s2);
}
}
else
{
if(match[2].find(s2)!=match[2].end())
{
string1=match[2][s2];
printf("integer: ");
cout<<string1<<endl;
}
else if(match[3].find(s2)!=match[3].end())
{
string1=match[3][s2];
printf("string: ");
cout<<string1<<endl;
}
else
{
printf("string: %c%s%c\n",34,s2,34);
if(Err==1)
printf("NOTICE: Undefined Constant %s.\n",s2);
}
}
}
}
}
}
}

67
HDOJ/4595_autoAC.cpp Normal file
View File

@ -0,0 +1,67 @@
#include<cstdio>
#include<cstring>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
map<string,int> match;
char s[100010][20];
int n,m,point[100010],one[100010],two[100010],sum_one[100010],sum_two[100010];
bool cmp(char a,char b)
{
return a<b;
}
int main()
{
int i,j,k,a,b,len,c,pos;
ll l,r,ans;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)
scanf("%s",s[i]);
match.clear();
for(i=n;i>=1;i--)
{
len=strlen(s[i]);
sort(s[i],s[i]+len,cmp);
k=match[s[i]];
if(k==0)
point[i]=n+1;
else
point[i]=k;
match[s[i]]=i;
}
a=n+1;b=n+1;
for(i=n;i>=1;i--)
{
c=point[i];
if(c<a)
b=a,a=c;
else if(c<b)
b=c;
one[i]=a;
two[i]=b;
}
for(i=1;i<=n;i++)
{
sum_one[i]=sum_one[i-1]+(one[i]-1);
sum_two[i]=sum_two[i-1]+(two[i]-1);
}
ans=0;
while(m--)
{
scanf("%I64d%I64d",&l,&r);
l+=ans;
r-=ans;
ans=0;
pos=upper_bound(one+1,one+n,r)-one-1;
if(pos>=l)
ans+=r*(pos-l+1)-(sum_one[pos]-sum_one[l-1]);
pos=upper_bound(two+1,two+n,r)-two-1;
if(pos>=l)
ans-=r*(pos-l+1)-(sum_two[pos]-sum_two[l-1]);
printf("%I64d\n",ans);
}
}
}

55
HDOJ/4596_autoAC.cpp Normal file
View File

@ -0,0 +1,55 @@
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 100001
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
struct Node
{
int x,y,z;
}node[1005];
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int check2(int d,int l,int r)
{
if(l%d==0 || r%d==0) return 1;
else if(r/d>l/d) return 1;
else return 0;
}
int check(int i,int j)
{
if(node[i].y>node[j].z || node[j].y>node[i].z)
{
if(node[i].y>node[i].z) swap(i,j);
int d=gcd(node[i].x,node[j].x);
if(check2(d,node[j].y-node[i].z,node[j].z-node[i].y))
return 1;
else
return 0;
}
return 1;
}
int main(){
int n,i,j;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
scanf("%d %d %d",&node[i].x,&node[i].y,&node[i].z);
int flag=0;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(check(i,j)) {flag=1;break;}
}
if(flag) break;
}
if(!flag)printf("Can Take off\n");
else printf("Cannot Take off\n");
}
return 0;
}

64
HDOJ/4597_autoAC.cpp Normal file
View File

@ -0,0 +1,64 @@
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int a[30],b[30];
int sum1[30];
int sum2[30];
int dp[30][30][30][30];
int solve(int l1,int r1,int l2,int r2)
{
if(dp[l1][r1][l2][r2] != -1)return dp[l1][r1][l2][r2];
if(l1 > r1 && l2 > r2)
return dp[l1][r1][l2][r2] = 0;
int ans = 0;
int sum = 0;
if(l1 <= r1)
sum += sum1[r1] - sum1[l1-1];
if(l2 <= r2)
sum += sum2[r2] - sum2[l2-1];
if(l1 <= r1)
{
ans = max(ans,sum - solve(l1+1,r1,l2,r2));
ans = max(ans,sum - solve(l1,r1-1,l2,r2));
}
if(l2 <= r2)
{
ans = max(ans,sum - solve(l1,r1,l2+1,r2));
ans = max(ans,sum - solve(l1,r1,l2,r2-1));
}
return dp[l1][r1][l2][r2] = ans;
}
int main()
{
int n;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
sum1[0] = sum2[0] = 0;
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
sum1[i] = sum1[i-1] + a[i];
}
for(int i = 1;i <= n;i++)
{
scanf("%d",&b[i]);
sum2[i] = sum2[i-1] + b[i];
}
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(1,n,1,n));
}
return 0;
}

129
HDOJ/4598_autoAC.cpp Normal file
View File

@ -0,0 +1,129 @@
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i)
#define ll long long
#define arc(a) ((a)*(a))
#define inf 10000000
#define exp 0.000001
#define N 305
#define T 400
int cont[N];
struct node
{
int y,w,pre;
};
node a[N*N];
int pre[N];
int color[N];
bool vis[N];
int dp[N];
char s[N][N];
int n,len;
bool dfs(int x)
{
color[x]=0;
queue<int>q; q.push(x);
while(!q.empty())
{
int x=q.front(); q.pop();
rep(i,n)
if(s[x][i]=='1')
if(color[i]==-1)
color[i]=color[x]^1,q.push(i);
else if(color[i]==color[x])
return false;
}
return true;
}
void init()
{
memset(color,-1,sizeof(color));
len=1;
memset(pre,-1,sizeof(pre));
rep(i,n) dp[i]=inf;
memset(cont,0,sizeof(cont));
memset(vis,false,sizeof(vis));
}
void addpage(int s,int t,int w)
{
a[len].y=t;
a[len].w=w;
a[len].pre=pre[s];
pre[s]=len++;
}
bool spfa()
{
queue<int>q;
q.push(0);
vis[0]=true; dp[0]=0;
while(!q.empty())
{
int x=q.front(); q.pop(); vis[x]=false;
for(int i=pre[x]; i!=-1; i=a[i].pre)
{
int y=a[i].y;
if(dp[x]+a[i].w<dp[y])
{
dp[y]=dp[x]+a[i].w;
if(vis[y]==false)
{
q.push(y);
vis[y]=true;
cont[y]++;
if(cont[y]>n)
return false;
}
}
}
}
return true;
}
bool solve()
{
init();
rep(i,n)
if(color[i]==-1)
if(!dfs(i))
return false;
rep(i,n)
repf(j,i+1,n-1)
{
if(s[i][j]=='0')
if(color[i]==0)
addpage(j,i,T-1);
else
addpage(i,j,T-1);
else
if(color[i]==0)
addpage(i,j,-T);
else addpage(j,i,-T);
}
return spfa();
}
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
rep(i,n) scanf("%s",s[i]);
if(solve())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

76
HDOJ/4599_autoAC.cpp Normal file
View File

@ -0,0 +1,76 @@
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long LL;
using namespace std;
LL n;
LL mod =2011;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
else
{
LL ans=exgcd(b,a%b,x,y);
LL tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}
}
LL Pow(LL a,LL b,LL mod)
{
LL ans=1;
while(b)
{
if(b&1)
{
b--;
ans=(ans*a)%mod;
}
else
{
b/=2;
a=(a*a)%mod;
}
}
return ans;
}
LL solve0(LL n)
{
LL ans=Pow(6,n%2010,2011);
ans+=24;
ans%=mod;
LL x,y;
exgcd(30,mod,x,y);
LL niyuan=(x%mod+mod)%mod;
ans=(ans*niyuan)%mod;
return ans;
}
LL solve(LL n)
{
LL ans=Pow(6,n%2010,2011);
ans=(ans+2010)%mod;
LL x,y;
exgcd(5,mod,x,y);
LL niyuan=(x%mod+mod)%mod;
ans=(ans*niyuan)%mod;
return ans;
}
int main()
{
while(scanf("%I64d",&n)!=EOF)
{
if(n==0)
break;
printf("%I64d %I64d\n",solve0(n),solve(n));
}
return 0;
}