2024牛客寒假算法基础集训营3
M题
错解
幂运算写成了乘~
#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;
}