博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【COCI2015-2016contest6】parovi
阅读量:4332 次
发布时间:2019-06-06

本文共 1231 字,大约阅读时间需要 4 分钟。

链接:

题意:

  给定一个正整数N(1<=N<= 20),表示你每次可以从1N这些自然数中取两个互质且不同的数出来构成一个数对,例如:N5时,你可以取{

{12}{34}{25}{35}}等,且数对不能重复。如果存在一个数X2<=X<=N,使得每个数对均满足a,b<X a,b>=X,则你的取法不合法。例如:你的数对如下{
{1
2}{34}},则X等于3时,这两个数对均满足以上条件,所以方案不合法。计算有多少种合法的取法,答案对1000000000取余。

 

题解:对于一个点对(a,b),我们将他视为覆盖区间[a,b] 那么问题就转化成了覆盖[1,n]的方案数辣!

 

#include 
#include
#include
#include
#include
#define MaxN 210#define mod 1000000000using namespace std;int n, N = 0;int x[MaxN], y[MaxN];int f[1<<20];int Solve(){ f[0] = 1; int top = (1<<(n-1))-1; for (int i = 1; i <= N; i++){ for (int j = top; j >= 0; j--){ int p = j|(((1<<(y[i]-1))-1)-((1<<(x[i]-1))-1)); f[p] = (f[j]+f[p]) % mod; } } return f[top];}int gcd(int x,int y){ if (!y) return x; return gcd(y, x%y);}int main(){ freopen("parovi.in", "r", stdin); freopen("parovi.out", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++){ for (int j = i+1; j <= n; j++){ if (gcd(i,j) != 1) continue; x[++N] = i; y[N] = j; } } cout<
View Code

 

转载于:https://www.cnblogs.com/Lukaluka/p/5409372.html

你可能感兴趣的文章
透析Java本质-谁创建了对象,this是什么
查看>>
BFS和DFS的java实现
查看>>
关于jquery中prev()和next()的用法
查看>>
一、 kettle开发、上线常见问题以及防错规范步骤
查看>>
eclipse没有server选项
查看>>
CRC码计算及校验原理的最通俗诠释
查看>>
QTcpSocket的连续发送数据和连续接收数据
查看>>
使用Gitbook来编写你的Api文档
查看>>
jquery扩展 $.fn
查看>>
Markdown指南
查看>>
influxDB的安装和简单使用
查看>>
JPA框架学习
查看>>
JPA、JTA、XA相关索引
查看>>
机器分配
查看>>
php opcode缓存
查看>>
springcloud之Feign、ribbon设置超时时间和重试机制的总结
查看>>
Go 结构体
查看>>
LINQ巩固
查看>>
观看杨老师(杨旭)Asp.Net Core MVC入门教程记录
查看>>
UIDynamic(物理仿真)
查看>>