https://codeforces.com/contest/1634
t组输入,每一组输入两行,第一行输入一个n和k分别表示字符串的长度,k表示可操作的次数,我们每次可以有两种操作:
我们来思考最终字符串的个数可能的情况,无非就两种:
#include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #define endl "\n" #define PII pair<int,int> #define INF 0x3f3f3f3f int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; ll ksm(ll a,ll b) { ll ans = 1; for(;b;b>>=1LL) { if(b & 1) ans = ans * a % mod; a = a * a % mod; } return ans; } ll lowbit(ll x){return -x & x;} const int N = 2e6+10; //----------------自定义部分---------------- int n,m,q,a[N]; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int t; cin>>t; while(t--) { cin>>n>>m; string s; cin>>s; int ans = 1; bool fg = true; for(int i = 0;i < n/2; ++i) { if(s[i] != s[n-i-1]) fg = false; } if(!fg && m) ans++; cout<<ans<<endl; } return 0; }
一开始alice的数字为x,bob的数字为x+3,然后有一串序列a,我们从前往后遍历这个序列,每次alice和bob必须和这个序列当前位置的数进行一些一下两个操作
这里我们能知道alice和bob一个为奇一个为偶,每次对奇数进行一个操作都会更改奇偶性,所以我们只需要统计a数组里面奇数的数量,然后判断alice经过这么多次奇偶更改是否和y的奇偶相同,如果是的话输出alice即可
#include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #define endl "\n" #define PII pair<int,int> #define INF 0x3f3f3f3f int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; ll ksm(ll a,ll b) { ll ans = 1; for(;b;b>>=1LL) { if(b & 1) ans = ans * a % mod; a = a * a % mod; } return ans; } ll lowbit(ll x){return -x & x;} const int N = 2e6+10; //----------------自定义部分---------------- ll n,x,y,m,q,a[N]; void slove(){ ll alice = x & 1,bob = (x + 3) + n; for(int i = 1;i <= n; ++i) if(a[i] & 1) alice ^= 1; y &= 1; if(alice == y) cout<<"Alice"<<endl; else cout<<"Bob"<<endl; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); ll t; cin>>t; while(t--) { cin>>n>>x>>y; for(ll i = 1;i <= n; ++i) { cin>>a[i]; } slove(); } return 0; }
给你一个 n × k n\times k n×k的矩阵,1到 n × k n\times k n×k的每个数字只能使用一次,然后将这些数字填充到这个矩阵中,要求这个矩阵每一行的每一个区间都能被起区间长度整除,求构造这样的矩阵,如果不能构造则输出NO,否则输出YES,并输出该矩阵
对于k为的情况,我们会发现无论n是多少,都一定能满足
然后我们能先到对每一行构造一个等差数列即可,最简单的等差数列就是按奇偶构造,即:1 3 5 7 9 ……
,2 4 6 8 10 ……
,那么我们来思考什么情况不能构造成功呢,其实就是n为奇数的时候
#include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #define endl "\n" #define PII pair<int,int> #define INF 0x3f3f3f3f int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; ll ksm(ll a,ll b) { ll ans = 1; for(;b;b>>=1LL) { if(b & 1) ans = ans * a % mod; a = a * a % mod; } return ans; } ll lowbit(ll x){return -x & x;} const int N = 5e2+10; //----------------自定义部分---------------- int n,k,m,q,a[N][N]; void slove(){ if(k == 1){//特判 cout<<"YES"<<endl; for(int i = 1;i <= n; ++i) cout<<i<<endl; return; } if(n % 2 == 0){ cout<<"YES"<<endl; int i = 1,loc1 = 1,loc2 = 2; for(int j = 1;j <= n/2; ++j) { for(int l = 1;l <= k; ++l) { a[j][l] = loc1; loc1+=2; } } for(int j = n/2+1;j <= n; ++j) { for(int l = 1;l <= k; ++l) { a[j][l] = loc2; loc2+=2; } } for(i = 1;i <= n; ++i) { for(int j = 1;j <= k; ++j) { cout<<a[i][j]<<" \n"[j == k]; } } } else{ cout<<"NO"<<endl; } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int t; cin>>t; while(t--) { cin>>n>>k; slove(); } return 0; }