小翔题库

题单 & 题解

std如下:

自己出的/抄的题。没有质量,没有难度。

std

  1. 皮蛋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<bits/stdc++.h>
typedef long long LL;
const int N=1e6+5;
int n,l,tot;LL ans;
struct node{ int x,p; } G[N];
inline bool operator < (node a,node b){ return a.x<b.x; }
signed main(){
scanf("%d%d",&n,&l);
for (int i=1;i<=n;++i) scanf("%d%d",&G[i].p,&G[i].x);
std::sort(G+1,G+1+n);
for (int i=1;i<=n;++i) G[i].p?++tot:ans+=tot;
printf("%lld",ans);
return 0;
}
  1. 毛笋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,k,f[N],ans;
struct node{ int x,y; } G[N];int idx;
inline bool operator < (node a,node b){ return a.x==b.x?a.y<b.y:a.x<b.x; }
signed main(){
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=k;++i){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
if (c>a+b-2) G[++idx]=(node){a,b};
}
std::sort(G+1,G+1+idx);
memset(f,0x3f,sizeof(f)),f[0]=0;
for (int i=1;i<=idx;++i){
int now=upper_bound(f,f+2+ans,G[i].y)-f-1;
ans=max(ans,now+1),f[now+1]=min(f[now+1],G[i].y);
}
printf("%d\n%d",n+m-2,ans);
return 0;
}
  1. 蒜头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<cstdio>
#include<cstring>
using namespace std;
const int N=501,M=51,P=290;
int n,m,k,p;
int A[N],B[N],F[N][M][P],ans=-1;
inline void tomax(int& x,const int y){
if (x<y) x=y;
}
signed main(){
scanf("%d%d%d%d",&n,&m,&k,&p);
memset(F,-1,sizeof(F));
for (int i=1;i<=n;++i) scanf("%d",&A[i]);
for (int i=1;i<=n;++i) scanf("%d",&B[i]);
F[1][m][A[1]]=k;
if (m) F[1][m-1][(A[1]>>1)*(A[1]>>1)%p]=k;
if (k) tomax(F[1][m][B[1]],k-1);
for (int i=1;i<n;++i){
for (int j=0;j<=m;++j){
for (int h=0;h<p;++h){
tomax(F[i+1][j][h*A[i+1]%p],F[i][j][h]);
if (j) tomax(F[i+1][j-1][h*(A[i+1]>>1)*(A[i+1]>>1)%p],F[i][j][h]);
if (F[i][j][h]) tomax(F[i+1][j][h*B[i+1]%p],F[i][j][h]-1);
}
}
}
for (int i=0;i<=m;++i){
for (int j=0;j<p;++j){
if (~F[n][i][j]) tomax(ans,j);
}
}
printf("%d",ans);
return 0;
}
  1. 藤瓜
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<bits/stdc++.h>
const int N=1e6+5;
int n,m,k,b[N],a[N],sum,T[N],tot,l1[N],r1[N],l2[N],r2[N],ans,ansk;
inline void I(int x,int y){ ++x;for(;x<=k;x+=x&-x) T[x]+=y; }
inline int Q(int x){ ++x;int res=0;for(;x;x-=x&-x) res+=T[x];return res; }
bool tag=1;
signed main(){
//freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=m;++i) scanf("%d",&b[i]);
for (int i=1;i<=n;++i) l1[i]=l2[i]=-1;
for (int i=1,j=1;i<=n;++i){
scanf("%d",&a[i]);
if (j<=m&&b[j]==i){
if (a[i]<k){
if (a[i]==0) l1[i]=l2[i]=-1;
else if (a[i]+sum<k||sum==k-1){
l1[i]=(sum+1)%k,r1[i]=(sum+a[i])%k;
}else{
l1[i]=sum+1,r1[i]=k-1;
l2[i]=0,r2[i]=(sum+a[i])%k;
}
if (~l1[i]) I(l1[i],1),I(r1[i]+1,-1);
if (~l2[i]) I(l2[i],1),I(r2[i]+1,-1);
}else ++tot;
++j;
}
sum=(sum+a[i])%k;
}
ans=tot+Q(0),ansk=-1;
for (int i=1,j=1;i<=n;++i){
if (j>m) break;
if (b[j]==i){
if (a[i]>=k) --tot;
if (~l1[i]) I(l1[i],-1),I(r1[i]+1,1);
if (~l2[i]) I(l2[i],-1),I(r2[i]+1,1);
++j;
}
int res=Q(a[i]%k)+tot;
if (res>ans) ans=res,ansk=i-1;
if (b[j-1]==i&&(a[i]>=k||l1[i]==0||l2[i]==0)) ++tot;
}
if (!tag) return printf("%d",ans),0;
if (~ansk) printf("%d\nyes\n%d",ans,ansk);
else printf("%d\nno",ans);
return 0;
}
  1. 蒜头2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int MOD=998244353,M=32001;
int p[M],vis[M],g[M],k[M],idx,m,ans,n;
struct node{
int a[2][2];
#define a(p,i,j) p.a[i][j]
} fi,non;
inline node operator * (node x,node y){
node z;
a(z,0,0)=a(z,0,1)=a(z,1,0)=a(z,1,1)=0;
for (int k=0;k<2;++k){
for (int i=0;i<2;++i){
for (int j=0;j<2;++j){
a(z,i,j)=(a(z,i,j)+(LL)a(x,i,k)*a(y,k,j)%MOD)%MOD;
}
}
}
return z;
}
inline int fib(int b){
if (b<0) return 0;
if (b==0) return 1;
if (b==1) return 1;
b-=2;
node s=non,x=non;
while (b){
if (b&1) s=s*x;
x=x*x,b>>=1;
}
return a((s*fi),0,0);
}
inline int ny(int x){
int b=MOD-2,s=1;
while (b){
if (b&1) s=(LL)s*x%MOD;
x=(LL)x*x%MOD,b>>=1;
}return s;
}
inline void INIT(){
a(non,0,0)=a(non,1,0)=a(non,0,1)=1;
a(non,1,1)=0;
a(fi,0,0)=1,a(fi,1,0)=1;
a(fi,0,1)=a(fi,1,1)=0;
for (int i=2;i<M;++i){
if (!vis[i]) p[++m]=i;
for (int j=1;p[j]*i<M;++j){
vis[p[j]*i]=1;
if (i%p[j]==0) break;
}
}
}
int res,sum;
inline int F(int x){
return (fib(x)+fib(x-2))%MOD;
}
void Dfs2(int tot,int cur,int mu){
if (!mu) return;
if (cur>idx){
//cout<<"Dfs2:: "<<tot<<" "<<mu*F(sum/tot)<<endl;
res=(res+(LL)mu*F(sum/tot)%MOD)%MOD;
return;
}
Dfs2(tot,cur+1,mu);
if (k[cur]>0) Dfs2(tot*g[cur],cur+1,-mu);
}
void Dfs1(int tot,int cur){
if (cur>idx){
res=0,sum=tot,Dfs2(1,1,1);
//cout<<"DFS1::: "<<tot<<" "<<res<<endl;
ans=(ans+(LL)res*ny(tot)%MOD)%MOD;
return;
}
for (int i=0,j=1;i<=k[cur];++i,j*=g[cur]){
int now=k[cur];
k[cur]=i;
Dfs1(tot*j,cur+1);
k[cur]=now;
}
}
signed main(){
//freopen("head9.in","r",stdin);
//freopen("head9.out","w",stdout);
INIT();
int T;cin>>T;
for (int test=1;test<=T;++test){
int nn;cin>>n;nn=n;idx=0,ans=0;
for (int i=1;p[i]*p[i]<=nn;++i){
if (nn%p[i]==0){
g[++idx]=p[i],k[idx]=0;
while (nn%p[i]==0) nn/=p[i],++k[idx];
}
}
if (nn>1) g[++idx]=nn,k[idx]=1;
Dfs1(1,1);
cout<<(ans+MOD)%MOD<<endl;
}
return 0;
}/*
4
2
3
4
667
*/
  1. 扑克
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#include<bits/stdc++.h>
#define gc getchar
#define pc putchar
#define F(i,x,y) for(int i=x;i<=y;++i)
#define R(i,x,y) for(int i=x;i>=y;--i)
inline int read(){
int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
inline void print(int x){ if (x>9) print(x/10);pc('0'+x%10); }
const int N=2e5+5;
int n,m,A[N],rt,tot;
struct Splay{
int son[2],fa,sz,sum,rev,val,cnt;
#define son(i,j) G[i].son[j]
#define fa(i) G[i].fa
#define sz(i) G[i].sz
#define sum(i) G[i].sum
#define rev(i) G[i].rev
#define val(i) G[i].val
#define cnt(i) G[i].cnt
} G[N<<2];
inline void swap(int& x,int& y){
int z=x;x=y;y=z;
}
inline void maintain(int k){
if (!k) return;
sz(k)=sz(son(k,0))+sz(son(k,1))+cnt(k);
sum(k)=sum(son(k,0))^sum(son(k,1))^((cnt(k)&1)?val(k):0);
}
inline void letrev(int k){
if (!k) return;
rev(k)^=1,swap(son(k,0),son(k,1));
}
inline void pushdown(int k){
if (!rev(k)||!k) return;
letrev(son(k,0)),letrev(son(k,1));
rev(k)=0;
}
void _put(int cur){
if (!cur) return;
pushdown(cur);
_put(son(cur,0));
printf("rt=%d, id=%d, fa=%d, sz=%d, sum=%d, rev=%d, val=%d, cnt=%d, ls=%d, rs=%d\n"
,rt,cur,fa(cur),sz(cur),sum(cur),rev(cur),val(cur),cnt(cur),son(cur,0),son(cur,1));
//F(i,1,cnt(cur)) printf("%d ",val(cur));
_put(son(cur,1));
}
void OUTPUT(){
printf("OUT::: \n"),_put(rt),pc('\n');
}
inline int addnod(int c,int v){
cnt(++tot)=c,val(tot)=v;
return maintain(tot),tot;
}
inline bool get(int k){ return k==son(fa(k),1); }
inline void rotate(int k){
int x=fa(k),y=fa(x),p=get(k);
son(x,p)=son(k,p^1);if (son(x,p)) fa(son(x,p))=x;
son(k,p^1)=x;fa(x)=k;
if (y) son(y,x==son(y,1))=k;else rt=k;fa(k)=y;
maintain(x),maintain(k);
}
inline void splay(int k,int pos){
if (!k) return;
for (int i=fa(k);(i=fa(k))!=pos;rotate(k)){
if (fa(i)!=pos) rotate(get(k)==get(i)?i:k);
}
}
int remaink;
inline int findk(int k){
if (k<1||k>sz(rt)) return (remaink=0),0;
int cur=rt;
while (cur){
pushdown(cur);
if (k<=sz(son(cur,0))) cur=son(cur,0);
else if (k<=sz(son(cur,0))+cnt(cur)) return (remaink=k-sz(son(cur,0))),cur;
else k-=sz(son(cur,0))+cnt(cur),cur=son(cur,1);
}
return 0;
}
inline int split(int k,int pos){
if (!k||pos==cnt(k)) return 0;
if (pos>cnt(k)||pos<0) printf("k = %d, pos = %d, cnt(k) = %d\n",k,pos,cnt(k)),exit(0);
if (pos==0) return k;
int cur=addnod(cnt(k)-pos,val(k));
cnt(k)=pos,son(cur,1)=son(k,1),son(k,1)=cur;
fa(cur)=k;if (son(cur,1)) fa(son(cur,1))=cur;
maintain(cur),maintain(k);
return cur;
}
inline void Insert(int pos,int c,int v){
int x=findk(pos),cur=addnod(c,v);
splay(x,0);
int y=findk(pos+1);
if (x==y) y=split(x,remaink-1);
if (y){
//printf("BEFORE, x=%d, y=%d\n",x,y);OUTPUT();
splay(y,x);//puts("SPLAyed");OUTPUT();
son(y,0)=cur,fa(cur)=y;
maintain(y),maintain(x);
}else{
son(x,1)=cur,fa(cur)=x;
maintain(x);
}
}
inline void Reverse(int le,int ri){
if (le==ri) return;
if (le==1&&ri==sz(rt)) return letrev(rt);
int x=findk(le-1);
split(x,remaink);
splay(x,0);
int y=findk(ri+1);
y=split(y,remaink-1);
if (y){
splay(y,x);
letrev(son(y,0));
}else{
letrev(son(x,1));
}
}
inline int mostle(int k){
if (!k) return 0;
while ((pushdown(k),son(k,0))) k=son(k,0);
return k;
}
inline int mostri(int k){
if (!k) return 0;
while ((pushdown(k),son(k,1))) k=son(k,1);
return k;
}
inline void letrot(int cur){
//printf("cur=%d\n",cur);
int l=mostle(cur),r=mostri(cur);
if (cnt(r)>1){
r=split(r,cnt(r)-1);
int fr=fa(r);
if (fr) son(fr,r==son(fr,1))=0;
son(l,0)=r,fa(r)=l;
return maintain(fr),maintain(r),maintain(l),splay(l,0),splay(fr,0);
}else{
int fr=fa(r);//printf("r=%d, son=%d\n",r,son(r,0));
if (son(r,0)) fa(son(r,0))=fr;
if (fr) son(fr,r==son(fr,1))=son(r,0);
son(r,0)=0,son(l,0)=r,fa(r)=l;
return maintain(fr),maintain(r),maintain(l),splay(l,0),splay(fr,0);
}
}
inline void Rotate(int le,int ri){
if (le==ri) return;
if (le==1&&ri==sz(rt)){
return letrot(rt);
}
int x=findk(le-1);
split(x,remaink);
splay(x,0);
int y=findk(ri+1);
y=split(y,remaink-1);
if (y){
splay(y,x);
letrot(son(y,0));
}else{
letrot(son(x,1));
}
}
inline int Sum(int le,int ri){
if (le==1&&ri==sz(rt)) return sum(rt);
int x=findk(le-1);
split(x,remaink);
splay(x,0);
int y=findk(ri+1);
y=split(y,remaink-1);
if (y){
splay(y,x);
return sum(son(y,0));
}else{
return sum(son(x,1));
}
}
int Build(int l,int r){
if (l>r) return 0;
if (l==r) return addnod(1,A[l]);
int mid=l+r>>1,cur=addnod(1,A[mid]);
son(cur,0)=Build(l,mid-1);
son(cur,1)=Build(mid+1,r);
if (son(cur,0)) fa(son(cur,0))=cur;
if (son(cur,1)) fa(son(cur,1))=cur;
maintain(cur);
return cur;
}
signed main(){
//freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
n=read(),m=read();
F(i,1,n) A[i]=read();
rt=Build(1,n);
//OUTPUT();
F(i,1,m){
int op=read(),x=read(),y=read();
if (op==1){
int z=read();
Insert(x,y,z);
}else if (op==2){
Reverse(x,y);
}else if (op==3){
Rotate(x,y);
}else if (op==4){
print(Sum(x,y)),pc('\n');
}
//OUTPUT();
}
return 0;
}
  1. 阿克
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<bits/stdc++.h>
const int N=2e5+5;
typedef long long LL;
struct Edge{ int val,pos; };
std::vector<Edge> G[N];
int n,k;LL maxn,mid,p,res[N];bool con[N];
#define abs(x) (x>0?x:-(x))
void Dfs(int cur,int fa,int fv){
for (int i=0;i<(int)G[cur].size();++i){
int to=G[cur][i].pos,v=G[cur][i].val;
if (to==fa) continue;
Dfs(to,cur,v);
if (abs(res[to])>abs(res[cur])||(abs(res[to])==abs(res[cur])&&res[to]<0)) res[cur]=res[to];
}
if (res[cur]>0) con[cur]=0;else if (res[cur]<0) con[cur]=1;
if (con[cur]&&res[cur]+fv>0) res[cur]=0;
else if (res[cur]+fv>mid){
++p;
if (-mid+fv>0) res[cur]=0;
else res[cur]=-mid+fv,con[fa]=(res[cur]==0);
}else res[cur]+=fv,con[fa]=(res[cur]==0);
}
inline bool check(){
for (int i=1;i<=n;++i) con[i]=0,res[i]=0;
p=0;Dfs(1,0,0);
if (!con[1]||res[1]>0) ++p;
return p<=k;
}
signed main(){
//freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
scanf("%d%d",&n,&k);
if (k==n) return putchar('0'),0;
for (int i=1;i<n;++i){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
G[a].push_back((Edge){c,b}),G[b].push_back((Edge){c,a});
maxn+=c;
}
LL le=1,ri=maxn;
while (le<ri){
mid=(le+ri)>>1;
if (check()) ri=mid;
else le=mid+1;
}
printf("%lld",le);
return 0;
}
  1. 排队
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//O(nlogn) Solution
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0)
const int N=1e7+3,INF=1e9+7;
struct node{
int val,tag;
} G[N];
inline bool operator < (node a,node b){
return a.val<b.val;
}
int A[N],ans[N],idx=1,n;
signed main(){
IOS;//freopen("game5.in","r",stdin);freopen("game5.out","w",stdout);
std::cin>>n;
for (int i=1;i<=n;++i){
std::cin>>A[i];
G[i]=(node){A[i],i};
}
std::sort(G+1,G+1+n);
for (int i=1;i<=n;++i){
while (idx<=n&&G[idx].val<A[i]){
if (G[idx].tag>i) ans[G[idx].tag]=i;
else ans[G[idx].tag]=-1;
++idx;
}
}
for (int i=idx;i<=n;++i) ans[G[i].tag]=-1;
for (int i=1;i<=n;++i) std::cout<<ans[i]<<' ';
return 0;
}/*
10
2 1 4 7 4 8 3 6 4 7
*/
  1. 平衡树性能测试(随机数据)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//BIT
#include<bits/stdc++.h>
#define gc getchar
#define pc putchar
inline int read(){
int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
inline void print(int x){ if (x<0) x=-x,pc('-');if (x>9) print(x/10);pc('0'+x%10); }
const int N=1e6+5;
int v[N],qt[N],qx[N],T[N],maxn;
bool vis[N];
struct node{
int val,tag;
} G[N];
inline void I(int x,int y){ for(;x<=maxn;x+=x&-x) T[x]+=y; }
inline int Q(int x){ int res=0;for(;x;x-=x&-x) res+=T[x];return res; }
inline bool operator < (node a,node b){ return a.val<b.val; }
inline int Findk(int k){
if (!k) return 0;
int res=0;
for (int i=19;~i;--i){
if (res+(1<<i)>maxn) continue;
if (T[res+(1<<i)]<k) res+=(1<<i),k-=T[res];
}
return res+1;
}
inline void Insert(int x){
if (vis[x]) return;
I(x,1),vis[x]=1;
}
inline int Pre(int x){
return v[Findk(Q(x-1))];
}
signed main(){
int m=read();v[0]=-1;
for (int i=1;i<=m;++i){
qt[i]=read(),qx[i]=read();
G[i].val=qx[i],G[i].tag=i;
}
std::sort(G+1,G+1+m);
int pre=1<<29;
for (int i=1;i<=m;++i){
if (pre!=G[i].val) pre=G[i].val,v[++maxn]=G[i].val;
qx[G[i].tag]=maxn;
}
for (int i=1;i<=m;++i){
if (!qt[i]) Insert(qx[i]);
else print(Pre(qx[i])),pc('\n');
}
return 0;
}
  1. 平衡树测试(构造数据)

同上。

  1. 链表

云剪贴板

  1. 线性筛
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
namespace LEON{
#define gc getchar
#define pc putchar
#define F(x,y,z) for(int x=y;x<=z;++x)
inline int read(){
int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
void put(int x){ if (x) put(x/10),pc('0'+x%10); }
inline void print(int x){ if (!x) pc('0');else put(x);pc('\n'); }
} using namespace LEON;
int f[1000001][3],p[78499];
signed main(){
int T=read()-1,n=read(),idx=0;
f[1][2]=1;F(i,2,n){
if (!f[i][2]) f[i][0]=1,f[i][1]=1,f[i][2]=i-1,p[++idx]=i;
for (int j=1;p[j]*i<=n;++j){
f[p[j]*i][0]=f[i][0]+1;
if (i%p[j]==0){
f[p[j]*i][1]=f[i][1],f[p[j]*i][2]=f[i][2]*p[j];
break;
}
f[p[j]*i][1]=f[i][1]+1,f[p[j]*i][2]=f[i][2]*(p[j]-1);
}
}
F(i,1,n) print(f[i][T]);
return 0;
}
  1. AK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<cstdio>
#define LL long long
using namespace std;
const int N=1e3+5,MOD=998244353;
const LL INF=1e18;
int A[N][N],nf,f[N*N];
LL F[N][N][3];//0fromup 1fromleft 2fromright
int n,m,K;
inline LL max(LL a,LL b,LL c)
{
if (a<b) a=b;
if (a<c) a=c;
return a;
}
inline int read()
{
int num=0,p=1;char ch=getchar();
while (ch>'9'||ch<'0')
{
if (ch=='-') p=-1;
ch=getchar();
}
while (ch<='9'&&ch>='0') num=(num<<1)+(num<<3)+(ch^48),ch=getchar();
return p*num;
}
inline int pow(int a,int b)
{
int s=1;
while (b)
{
if (b&1) s=(LL)s*a%MOD;
a=(LL)a*a%MOD;
b>>=1;
}
return s;
}
int main()
{
n=read(),m=read(),K=read();
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
A[i][j]=read();
for (int i=0;i<=n+1;++i)
for (int j=0;j<=m+1;++j)
F[i][j][0]=F[i][j][1]=F[i][j][2]=-INF;
F[1][1][0]=0;
for (int i=1;i<=n;++i)
{
if (i!=1)
for (int j=1;j<=m;++j)
F[i][j][0]=max(F[i-1][j][0],F[i-1][j][1],F[i-1][j][2])+A[i][j];
for (int j=2;j<=m;++j)
F[i][j][1]=max(F[i][j-1][0],F[i][j-1][1],-INF)+A[i][j];
if (i!=1)
for (int j=m-1;j;--j)
F[i][j][2]=max(F[i][j+1][0],F[i][j+1][2],-INF)+A[i][j];
}
int ans=max(F[n][m][0],F[n][m][1],F[n][m][2])%MOD;
ans=pow(ans,K);
f[0]=1;
for (int i=1;i<=n*m;++i) f[i]=(LL)f[i-1]*i%MOD;
nf=pow(f[n*m],MOD-2);
for (int i=n*m;i;--i) ans=(LL)ans*nf%MOD,nf=(LL)nf*i%MOD;
printf("%d",ans);
}
  1. 运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<cstdio>
using namespace std;
char c[1200];int idx=-1;
int main()
{
char ch=getchar();
while (ch!=EOF)
{
if (ch=='.')
{
puts("no");
return 0;
}
c[++idx]=ch;
ch=getchar();
}
if (c[0]=='1'&&(c[1]>'9'||c[1]<'1')) putchar('1');
else putchar('1'),putchar('/'),puts(c);
}