2024牛客寒假算法基础集训营3

M题

智乃的36倍数(normal version)

错解

幂运算写成了乘~

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define debug(x) cout<<x<<" "<<endl;
#define _debug(a,n) for(int i=0;i<n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
struct node{
	int v,i;
}p[100005];
vector<pair<int,int>>v[100005];
const int mod=36;
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t,n,x,y,z,f=1;cin>>n;
	map<pair<int,int>,int>mp;	
	for(int h=0;h<=35;h++){
		for(int i=0;i<=35;i++){
			//if(h==i&&h!=0) continue;
			for(int j=0;j<=18;j++){
				//if(h==0&&i==0) cout<<(h*(j*10)%mod)%mod+i<<endl;
				if(((h*(j*10)%mod)%mod+i)%mod==0) v[h].push_back({i,j});
			}
		}		
	}	
//	cout<<v[0].size()<<endl;
//	for(auto it:v[0]){
//		cout<<it.first<<" "<<it.second<<endl;
//	}
	for(int i=1;i<=n;i++){
		cin>>p[i].v;
		int tp=p[i].v,cnt=0;
		while(tp){
			tp/=10;
			cnt++;
		}
        p[i].v%=mod;
		p[i].i=cnt;
		//cout<<p[i].v<<p[i].i<<endl;
		mp[{p[i].v,p[i].i}]++;
		//cout<<cnt<<endl;
	} 
	int ans=0;
	pair<int,int>now;
	for(int i=1;i<=n;i++){
		now={p[i].v,p[i].i};
		for(auto it:v[p[i].v]){
			if(mp.count(it)){
				//cout<<it.first<<" "<<it.second<<endl;
				//mp[now]--;
				ans+=mp[it];
				if(now==it) ans--;
				//mp[now]++;
				//if(it.first==now.v&&it.second==now.i) ans--;
			}
			
		}
	}
	cout<<ans;
	return 0;
}

正解

  • 看题解优化前的代码—_—
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define debug(x) cout<<x<<" "<<endl;
#define _debug(a,n) for(int i=0;i<n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
struct node{
	int v,i;
}p[100005];
vector<pair<int,int>>v[100005];
const int mod=36;
int fp(int b,int p){
	int res=1;
	while(p){
		if(p&1) res=res*b%mod;
		b=b*b%mod;
		p>>=1;
	}
	return res;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t,n,x,y,z,f=1;cin>>n;
	map<pair<int,int>,int>mp;	
	for(int h=0;h<=35;h++){
		for(int i=0;i<=35;i++){
			//if(h==i&&h!=0) continue;
			for(int j=0;j<=18;j++){
				//if(h==0&&i==0) cout<<(h*(j*10)%mod)%mod+i<<endl;
				if((h*(fp(10,j))%mod+i)%mod==0) v[h].push_back({i,j});
			}
		}		
	}	
//	cout<<v[3].size()<<endl;
//	for(auto it:v[3]){
//		cout<<it.first<<" "<<it.second<<endl;
//	}
	for(int i=1;i<=n;i++){
		cin>>p[i].v;
		int tp=p[i].v,cnt=0;
		while(tp){
			tp/=10;
			cnt++;
		}
        p[i].v%=mod;
		p[i].i=cnt;
		//cout<<p[i].v<<p[i].i<<endl;
		mp[{p[i].v,p[i].i}]++;
		//cout<<cnt<<endl;
	} 
	int ans=0;
	pair<int,int>now;
	for(int i=1;i<=n;i++){
		now={p[i].v,p[i].i};
		for(auto it:v[p[i].v]){
			if(mp.count(it)){
				//cout<<it.first<<" "<<it.second<<endl;
				//mp[now]--;
				ans+=mp[it];
				if(now==it) ans--;
				//mp[now]++;
				//if(it.first==now.v&&it.second==now.i) ans--;
			}
			
		}
	}
	cout<<ans;
	return 0;
}

  • 优化后的代码—^—
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
const int N=1e5+5,mod=36;
pair<int,int>p[N];
map<pair<int,int>,int>mp;
vector<pair<int,int>>v[N];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t,n,x,cnt=0,ans=0;cin>>n;
	for(int i=0;i<=35;i++){
		for(int j=0;j<=35;j++){
			if(((i*28)%mod+j)%mod==0) v[i].push_back({j,2});
			if(((i*10)%mod+j)%mod==0) v[i].push_back({j,1});
		}
	}
	for(int i=1;i<=n;i++){
		cin>>x;
		if(x>=10) p[i]={x%36,2};
		else p[i]={x,1};
		mp[p[i]]++;
	}
	for(int i=1;i<=n;i++){
		auto now=p[i];
		for(auto it:v[p[i].first]){
			if(mp.count(it)){
				ans+=mp[it];
				if(now==it) ans--;
			}
		}
	}
	cout<<ans;
	return 0;
}

posted @ 2024-02-13 15:37  mono_4  阅读(20)  评论(0编辑  收藏  举报