P6521 [CEOI2010 day2] pin

Solution#

EricQian 很有精神!114514

我们都要像他一样有精神!114514

EricQian 说你可以设一个 d 表示恰好某些位置相同的对数,p 表示至少某些位置相同的对数,D 表示恰好几个位置相同的对数,P 表示至少几个位置相同的对数。114514

EricQianPp 都可以直接求。于是我们来考虑 Dd 的求法。114514

EricQian 觉得你很逊,于是他来帮你颓式子:114514

D4=P4D3=d123+d124+d134+d234=(p123p1234)+(p124p1234)+(p134p1234)+(p234p1234)=P34D4D2=d12+d13+d14+d23+d24+d34=(p12d123d124d1234)+(p13d123d134d1234)+(p14d124d134d1234)+(p23d123d234d1234)+(p24d124d234d1234)+(p34d134d234d1234)=P23D36D4D1=d1+d2+d3+d4=(p1d12d13d14d123d124d134d1234)+(p2d12d23d24d123d124d234d1234)+(p3d13d23d34d123d234d134d1234)+(p4d14d24d34d124d134d234d1234)=P12D23D34D4

哇!这真是太有精神了吧!真的没有再比这样的事情更有精神了!114514

我们的 EricQian 真是太厉害了!大家快来膜拜 EricQian!!!114514

Code#

#define int long long
using namespace std;
const int MAXN=5e4+10;
map<string,int> cnt;
string s[MAXN];
int P[MAXN],D[MAXN];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int n,d;cin>>n>>d;
	rep(i,1,n) cin>>s[i];
	rep(i,1,15){
		int ppc=__builtin_popcount(i);
		cnt.clear();
		rep(j,1,n){
			string t;
			rep(k,0,3)
				if(i&(1<<k))
					t+=s[j][k];
			P[ppc]+=(cnt[t]++);
		}
	}D[4]=P[4];
	D[3]=P[3]-4*D[4];
	D[2]=P[2]-3*D[3]-6*D[4];
	D[1]=P[1]-2*D[2]-3*D[3]-4*D[4];
	if(d==4) cout<<n*(n-1)/2-D[1]-D[2]-D[3]-D[4]<<'\n';
	else cout<<D[4-d]<<'\n';
	return 0;
}
posted @   ZCETHAN  阅读(46)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
主题色彩