教育Codeforcesラウンド84 DIV2题解(ABCDE)

ゲームリンク:https://codeforces.com/contest/1327

奇数の整数の和A.

数分のうちにロードするまで、カットとカットが555 Aを固定しました

波解析し、見つかった最小限の\(K \)番号がなければなりません\(L、3,5、...、(-2K。1)\) あれば\(N- \)が、それはあまりそれらの合計よりではありません

そして、それらの和のパリティ場合と\(N \)は、仕事と同じではないんではありません

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
#define int ll
int t,n,j;
signed main(){
	cin>>t;
	while(t--){
		cin>>n>>j;
		cout<<(j*(1+2*j-1)/2<=n && (j*(1+2*j-1)/2+n)%2==0?"YES":"NO")<<endl;
	}
	return 0;
}

B.王女と王子

自閉症には本当に長いタイトル

試合の最初の波で、次いでライン上の2つの非整合出力を見つけます。

もちろん直接OPTIMALが見つかりません

スパイシーなチキンコード警告

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
#define int ll
int t,n,j;
bool f[N],g[N]; //g表示公主被匹配,f表示王子被匹配
vector<int> a[N];
void find(){
	cout<<"IMPROVE"<<endl;
	repeat(i,0,n)if(!g[i]){cout<<i+1; break;}
	repeat(i,0,n)if(!f[i]){cout<<' '<<i+1<<endl; break;}
}
signed main(){
	cin>>t;
	while(t--){
		cin>>n;
		repeat(i,0,n)a[i].clear();
		fill(f,f+n,0);
		fill(g,g+n,0);
		int cnt=0;
		repeat(i,0,n){
			int m,x; cin>>m;
			repeat(j,0,m)cin>>x,x--,a[i].push_back(x);
			for(auto p:a[i]){
				if(!f[p]){
					f[p]=1;
					g[i]=1;
					cnt++;
					break;
				}
			}
		}
		if(cnt==n)cout<<"OPTIMAL"<<endl;
		else find();
	}
	return 0;
}

チップを搭載したC.ゲーム

ダイレクト入力emmm \(N、M \)のような、怠惰なバック入出力点は、すべての歩行を横断することができ

私は長い間ためらっ

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
#define int ll
int t,n,m;
signed main(){
	cin>>n>>m;
	string s;
	s+=string(m-1,'L');
	s+=string(n-1,'U');
	repeat(i,0,n){
		if(i%2==0)s+=string(m-1,'R');
		else s+=string(m-1,'L');
		if(i!=n-1)s+='D';
	}
	cout<<s.length()<<endl;
	cout<<s<<endl;
	return 0;
}

D.無限のパス

ウィル・サイクルの交換は問題になりません

まず、互いに素巡回置換の数に分割することができる任意の交換の名前だったかわからない定理があります

何?サイクルの交換は何ですか?13回のテーマは、(巨大な霧)を公開していません。

何巡回置換いくつかのブログの最も簡単なように見えるとのWiki-OIを得ることは容易で見つけることができます。https://oi-wiki.org/math/permutation-group/を

だから、私はあなたがこの定理はするデフォルト:

我々は、巡回置換最初の検索\(P \)を、長さが示される(すべての巡回置換は、次の動作に耐えなければならない)(\ LEN)\実際には、(P ^ K \)\複数にさらに分割することができ、実際に正確小さな巡回置換、および\(\ GCD(K、lenの )\) 、当然のことながら、各マイナー・サイクルの長さに置き換えられる(\ \ dfrac {LEN} { \ GCD(K、LEN)} \)

そして結論\(\ GCD(K、lenが )\) 2に等しい\(kは\)小さなループの交換をリッピング(することができますまったく同じです(LEN = 6、K = \ 1 ... 6 \) プレイを遊び)

私たちは聞かせて(K \)\すべてを\(LEN \)除数を(ので、各\(\ GCD(kは、lenの )\) と同じではありません)、小さなサイクルはすべての順列はそれを聞いて答えが更新された場合は、1色だけでなく、

最終的な複雑さがある(O(N \ SQRT N \ )\)

スパイシーなチキンコード警告

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
#define int ll
int t,n,m,ans;
int a[N],co[N],vis[N];
vector<int> rec,v;
bool work2(int s,int step){
	int n=rec.size();
	int p=s,nxt=(p+step)%n;
	while(nxt!=s){
		if(rec[p]!=rec[nxt])return 0;
		p=nxt,nxt=(p+step)%n;
	}
	return 1;
}
void work(){
	int n=rec.size();
	for(int i=1;i<n;i=n/(n/(i+1))) //这花里胡哨的其实是求n的所有约数
	if(n%i==0){
		repeat(j,0,i){
			if(ans<=i)return;
			if(work2(j,i)){
				ans=min(ans,i);
				return;
			}
		}
	}
	int i=n;
	repeat(j,0,i){
		if(ans<=i)return;
		if(work2(j,i)){
			ans=min(ans,i);
			return;
		}
	}
}
signed main(){
	cin>>t;
	while(t--){
		cin>>n;
		fill(vis,vis+n+1,0);
		repeat(i,1,n+1)cin>>a[i];
		repeat(i,1,n+1)cin>>co[i];
		ans=1e9;
		repeat(i,1,n+1)if(!vis[i]){
			int p=i;
			rec.clear();
			while(!vis[p]){
				rec.push_back(co[p]);
				vis[p]=co[p];
				p=a[p];
			}
			work();
		}
		cout<<ans<<endl;
	}
	return 0;
}

E.は、ブロックをカウント

(クァン)数のタイトルを参照して幸せ(歌った)臭い(XIN)音楽(ビング)であります

各サイズについて\(I \)速い、我々はプットが真ん中あれば、それは隣接する二つの数字があることがわかった\(9 \)残り、番目の値(ブロック付加と同じ値)\(NI-2 \)ブロックを有している(\ 10 \)を番目の値を

あなたが境界線の上に置く場合は、そこに隣接する唯一の数であるため、いくつかの変更

最後に、再びのためのそれに

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
const int mod=(0?1000000007:998244353); ll mul(ll a,ll b,ll m=mod){return a*b%m;} ll qpow(ll a,ll b,ll m=mod){ll ans=1; for(;b;a=mul(a,a,m),b>>=1)if(b&1)ans=mul(ans,a,m); return ans;} ll getinv(ll v,ll m=mod){return qpow(v,m-2,m);}
#define int ll
int t,n,m;
signed main(){
	cin>>n;
	repeat(i,1,n+1){
		ll ans=0;
		if(n-i>=2){
			ans+=mul(81*(n-i-1),qpow(10,n-i-2));
			ans+=mul(9*2,qpow(10,n-i-1));
			ans%=mod;
		}
		else if(n-i==1){
			ans+=mul(9*2,qpow(10,n-i-1));
			ans%=mod;
		}
		else ans=1;
		ans=mul(ans,10);
		cout<<ans<<' ';
	}
	return 0;
}

おすすめ

転載: www.cnblogs.com/axiomofchoice/p/12556454.html