- 郭妍溪 的博客
7月DAY5
- @ 2025-7-23 20:07:55
A.单次交换
题意:交换字符串中随便两个数,共有多少种情况。 思路:统计每个字符的数量,利用数量找出多算的情况,最后用总数减去。 错因:方法不合适。 代码:
#include<bits/stdc++.h>
using namespace std;
long long cnt[300];
int main()
{
freopen("swap.in","r",stdin);
freopen("swap.out","w",stdout);
string s;
bool l=0;
cin>>s;
long long n=s.size(),m=0;
m=(n-1)*n/2;
for(long long i=0;i<n;i++)
{
cnt[s[i]]++;
}
for(long long i=0;i<='z';i++)
{
if(cnt[i]>1&&l==0)
{
m++;
l=1;
}
m-=(cnt[i]-1)*cnt[i]/2;
}
cout<<m;
return 0;
}
B. 开关
题意:有N个开关,每个开关有“开”和“关”两种状态,还有M个灯泡。开关编号为1到N,灯泡编号为1到M。灯泡i连接到ki个开关:开关si1,si2,...,sik。当这些开关中处于“开”状态的开关数量模2等于pi时,灯泡i会被点亮。有多少种开关的“开”和“关”状态的组合能够点亮所有灯泡? 思路:用vector动态数组。 错因:就没写。 代码:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, m;
vector<int> a[15];
int p[15], ans, sw[15];
bool check()
{
for (int i = 1; i <= m; i++)
{
int cur = 0;
for (int k = 0; k < a[i].size(); k++) cur ^= sw[a[i][k]];
if (cur != p[i]) return false;
}
return true;
}
void dfs(int u)
{
if (u == n + 1)
{
if (check())
ans++;
return;
}
dfs(u + 1);
sw[u] = 1;
dfs(u + 1);
sw[u] = 0;
}
int main()
{
freopen("switch.in", "r", stdin);
freopen("switch.out", "w", stdout);
int k, t;
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> k;
while (k--)
{
cin >> t;
a[i].push_back(t);
}
}
for (int i = 1; i <= m; i++) cin >> p[i];
dfs(1);
cout << ans << endl;
return 0;
}
C.不可表示的数
题意:在1到N(包括N)之间的整数中,有多少个不能表示a^b^的形式,其中a和b都是不小于2的整数? 思路:用枚举法,循环枚举a和b。 错因:想太复杂了。 代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
long long n;
cin>>n;
set<long long> s;
for(long long i=2;i*i<=n;i++)
{
long long x=i*i;
while(x<=n)
{
s.insert(x);
x=x*i;
}
}
cout<<n-s.size();
return 0;
}