NOIP2016 普及组南海区模拟题解题报告

第四题:

题意:给定一个无向图,求a->b->c->d(a!=b!=c!=d)的方案数。


首先,我们把这个路径看成a-b-c-d。然后,枚举b-c两条边。然后,设r[i]为点i连接其他点的边数,则总方案数为sum((r[i]-1)*(r[j]-1)|i!=j|)。但是,这并不是最终的结果。我们不能排除情况a-b-c-a。


这时,就可以把b->a,c->a的情况给去掉。

我们以f[i]表示第i个点的情况(也就是输入数据),可以把它当成一个二进制数。

那么,我们就要减去sum(二进制中1的个数(f[i]&f[j])|i!=j|)

这时,可以用bitset来实现这个功能。

程序:

#include <cstdio>
#include <cstring>
#include <bitset>
using namespace std;
#define Maxn 1510
int n;
long long ans;
char s[Maxn];
bitset<Maxn> f[Maxn];
int r[Maxn];
int main()
{
	scanf("%d\n",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s);
		for(int j=1;j<=n;j++)
		{
			f[i][j] = s[j-1] - '0';
			if(f[i][j]) r[i]++;
		}
	}
	
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	if(f[i][j])
	{
		ans += 0LL + (r[i]-1) * (r[j]-1);
		ans -= 0LL + (f[i] & f[j]).count();
	}

	
	printf("%lld\n",ans);	
	return 0;
}



转载于:https://www.cnblogs.com/ouqingliang/p/9245265.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值