ABC293 CDE Solution - shengbinhao

shengbinhao 2023-07-12 21:47:43 2023-07-20 21:27:57 7


由于这一题数据很小,爆搜就行了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[15][15],h,w,ans=0;
set<int> s;
void dfs(int i,int j){
	if(i>h||j>w) return;
	if(s.find(a[i][j])!=s.end()) return;
	if(i==h&&j==w) ans++;
	s.insert(a[i][j]);
	dfs(i+1,j);
	dfs(i,j+1);
	s.erase(a[i][j]);
}
signed main(){
	
	cin>>h>>w;
	for(int i=1;i<=h;++i){
		for(int j=1;j<=w;++j){
			cin>>a[i][j];
		}
	}
	dfs(1,1);
	
	cout<<ans;
	
	
	
	return 0;
}

我们把单独的一条绳子也看成一条链,操作一次,就减少一条链,所以链的数量就等于 n-m

用并查集来判断两个绳子是否已经被链接,如果是,那就形成了一个环。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,m,f[N],ans1,ans2;
int fa(int x){
	return f[x]==x?x:f[x]=fa(f[x]);
}
signed main(){
	
	cin>>n>>m;
	ans2=n-m;
	int a,b;
	char c;
	for(int i=1;i<=n;++i) f[i]=i;
	for(int i=1;i<=m;++i){
		cin>>a>>c>>b>>c;
		if(fa(a)==fa(b)){
			ans1++;
		}
		else{
			f[fa(a)]=fa(b);
		}
	}
	
	cout<<ans1<<" "<<ans2;
	
	
	return 0;
}

等比数列公式:

推导过程:

由于这里要模一个数,所以直接带走。

,我们可以让 先乘 ,然后就可以保证整除了。

ps:此处需要用到快速幂,并使用 __int128

#include<bits/stdc++.h>
#define int long long
#define _int __int128
using namespace std;
int a,x,mod,ans;
_int ksm(_int n,_int i,_int m){
	if(i==0) return 1;
	if(i==1) return n%m;
	_int t=ksm(n,i/2,m)%m;
	t=t*t%m;
	if(i%2==1) t=t*n%m;
	return t;
}
signed main(){
	
	
	cin>>a>>x>>mod;
	if(a==1){
		cout<<x%mod;
		return 0;
	}
	mod=mod*(a-1);
	_int b=ksm(a,x,mod);
	if(b==0) b=mod;
	cout<<(int)((b-1)/(a-1));
	return 0;
}
{{ vote && vote.total.up }}