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;
}