1003 Boring Game
- 题目:
https://vjudge.net/contest/387654#problem/C
- 思路:
逆向思考,当把n张纸展开还原时,相当于把序列P的上半部分截取后,倒置,放在剩下数据的左侧。折叠共k次,所以模拟k次即可。
- 代码:
学习别人的
#include<iostream>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
//mxn=2^k
const int mxn=1050;
bool s=0;
int a[2][mxn][mxn];
int n,m,c,k;
vector<int> v[mxn];
//rev=0 顺序输出 =1则逆序输出
bool rev[mxn];
//虚假的快速幂,无关紧要
int ksm(int a,int b)
{
int ret=1;
for(int i=0;i<b;i++)
ret*=a;
return ret;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
m=ksm(2,k);
c=1;
memset(rev,0,sizeof(rev));
s=0;
for(int i=1;i<=m;i++) a[0][i][1]=i;
for(int i=1;i<=m;i++)
{
v[i].clear();
for(int j=0;j<n*2;j++)
{
int tmp;
scanf("%d",&tmp);
v[i].push_back(tmp);
}
}
while(m!=1)
{
for(int j=1;j<=c;j++)
{
for(int i=1;i<=m/2;i++)
{
a[s^1][m/2+1-i][c+1-j]=a[s][i][j];
rev[a[s][i][j]]^=1;
}
}
for(int i=m/2+1;i<=m;i++)
{
for(int j=1;j<=c;j++)
{
a[s^1][i-m/2][c+j]=a[s][i][j];
}
}
m/=2;
c*=2;
s^=1;
}
bool start=1;
for(int i=0;i<n*2;i++)
{
for(int j=1;j<=c;j++)
{
if(start) start=0;
else printf(" ");
int no=a[s][1][j];
printf("%d",v[no][rev[no]==0?i:n*2-1-i]);
}
}
printf("\n");
}
return 0;
}
1009 Paperfolding
**-题目: **
https://vjudge.net/contest/387654#problem/I
- 思路:
一张纸对折n次,每次对折有L,U,R,D四种对折方式。最后一次对折完,从水平和竖直方向各切一刀,求最后的到的纸片数。
期望推导过程:
- 代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int qmi(int a,int b){
int res=1;
while(b){
if(b&1)res=res*a%mod;
b>>=1;
a=a*a%mod;
}
return res;
}
signed main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int a=qmi(2,n)+1;
a%=mod;
int b=2*qmi(3,n)%mod*qmi(qmi(2,n),mod-2)%mod;
cout<<(a+b)%mod<<endl;
}
return 0;
}
1012 Set1
-题目:
https://vjudge.net/contest/387654#problem/L
- 思路:
- 代码:
学习别人的
#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ll long long
#define int long long
#define pii pair<int, int>
#define lowbit(x) (x &(-x))
#define ls(x) x<<1
#define rs(x) (x<<1+1)
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int way[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
using namespace std;
const int inf = 0x7fffffff;
const double PI = acos(-1.0);
const double eps = 1e-6;
const ll mod = 998244353;
const int N = 5e6 + 5;
int t, n, f[N];
int qmi(int a, int k)
{
int res = 1;
while(k){
if(k & 1) res = (ll)res * a % mod;
k >>= 1;
a = (ll)a * a % mod;
}
return res;
}
void Inint(){
f[1] = 1;
for(int i = 2; i < N; i ++) f[i] = f[i-1]*i%mod;
}
signed main(){
IOS;
Inint();
cin >> t;
while(t --){
cin >> n;
if(n == 1){
cout << 1 << endl;
continue;
}
for(int i = 0; i < n/2; i ++) cout << 0 << " ";
int m = f[n/2], d = qmi(2, n/2) * f[n/2]%mod;
d = qmi(d, mod-2);
cout << m*d%mod << " ";
for(int i = 1; i < n/2; i ++){
m = m*(n/2+i)%mod;
m = m*qmi(i*2, mod-2)%mod;
cout << m*d%mod << " ";
}
cout << m*d%mod << endl;
}
return 0;
}
比赛代码:https://paste.ubuntu.com/p/MdXXxdHbbx/