URAL 1091. Tmutarakan Exams 容斥

从1到s选出k个数 他们的最大公约数大于1 求方案数

容斥 S(1)-S(2)+S(3) S(x)为选出k个数的公因子个数为x的数量

#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 55;
int prime[maxn], vis[maxn];
int n, m;
int get_primes(int n)
{
	int m = sqrt(n+0.5), c = 0;
	for(int i = 2; i <= n; i++)
		if(!vis[i])
		{
			prime[c++] = i;
			for(int j = i*2; j <= n; j += i)
			{
				vis[j] = 1;
			}
		}
	return c;
}
LL cm(int n, int m)
{
	LL ans = 1;
	for(int i = 1; i <= m; i++)
	{
		ans *= (LL)n--;
		ans /= (LL)i;
	}
	return ans;
}
void dfs(int i, int x, int k, int m, LL& ans, int c)
{
	if(i == c)
	{
		if(!k)
			return;
		if(k&1)
			ans += cm(m/x, n);
		else
			ans -= cm(m/x, n);
		return;
	}
	dfs(i+1, x*prime[i], k+1, m, ans, c);
	dfs(i+1, x, k, m, ans, c);
}

LL cal(int c)
{
	LL ans = 0;
	dfs(0, 1, 0, m, ans, c);
	if(ans > 10000)
		ans = 10000;
	return ans;
}
int main()
{
	int c = get_primes(50);
	//printf("%d\n", c);
	while(scanf("%d %d", &n, &m) != EOF)
	{
		printf("%lld\n", cal(c));
	}
	return 0;
}
时间: 2024-10-12 05:46:34

URAL 1091. Tmutarakan Exams 容斥的相关文章

F - Tmutarakan Exams URAL - 1091 -莫比乌斯函数-容斥 or DP计数

F - Tmutarakan Exams 题意 : 从 < = S 的 数 中 选 出 K 个 不 同 的 数 并 且 gcd > 1 .求方案数. 思路 :记 录 一 下 每 个 数 的 倍 数 vector 存 储 ,最后从 2 开始 遍历 一遍每个数 ,从 他的倍数中 挑选 k个 组合数求解. 但是会有重复,因为 比如 K=2,S=15时 , 2倍数 : 2  ,4 , 6,  8, 10,  12, 14 ,   挑出了 这种情况 6 ,12,然后 从3的倍数 : 3, 6 ,9,12

Ural 1091 Tmutarakan Exams

Tmutarakan Exams Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Original ID: 109164-bit integer IO format: %lld      Java class name: (Any) University of New Tmutarakan trains the first-class specialists in mental arith

Ural 1091 Tmutarakan Exams【容斥原理】

题目链接: http://acm.timus.ru/problem.aspx?space=1&num=1091 题目大意: 给你两个整数K和S,从小于等于S的非负整数中选择K个数,并且K个数的最大公约数大于1, 问总共有多少组.(2 <= K <= S <= 50). 解题思路: 因为 2 <= K <= S <= 50,我们可以直接枚举质因数,求出从每个质因数的倍数中选择k个数 的组合数,累加起来即为方案个数,但是这样重复计算了很多情况. 例如:S = 20,

URAL 1091. Tmutarakan Exams(容斥原理)

题目链接 题意 : 给你两个数k,s,让你找k个数,这k个数都不大于s,并且这k个数的公约数大于1. 思路 : 枚举一下素数倍数,求组合数,最后容斥原理求最终结果. 当k=3,s=20的时候 : 2 : 2 4 6 8 10 12 14 16 18 20 3 :3 6 9 12 15 18 5 :5 10 15 20 只要从每个集合里边找出k个即可,这就是用组合数了.但是会有重复的,例如 2 : 6 12 18 3 : 6 12 18 这样就多加了一个,要再减去,所以就是容斥原理.加一个的减两个

1091. Tmutarakan Exams

1091. Tmutarakan Exams Time limit: 1.0 secondMemory limit: 64 MB University of New Tmutarakan trains the first-class specialists in mental arithmetic. To enter the University you should master arithmetic perfectly. One of the entrance exams at the Di

ural 1932 The Secret of Identifier 容斥

题目链接:点击打开链接 stl+容斥 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <iostream> #include <set> using namespace std; #define N 65540 #define ll __int64 ll n; ll a[N][4], mul[4]={1,16,25

POJ 1091 跳蚤(分解质因数 + 容斥 + 大数)

跳蚤 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8910   Accepted: 2676 Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字.跳蚤每次可以从卡片上任意选择一个自然数S,然后向左,或向

2014 Super Training #3 H Tmutarakan Exams --容斥原理

原题: URAL 1091  http://acm.timus.ru/problem.aspx?space=1&num=1091 题意:要求找出K个不同的数字使他们有一个大于1的公约数,且所有的数字都不能大于一个指定的数字S. 解法:可以考虑每个S内的素数,此素数和它的所有倍数构成一个集合,则可以在这些集合中任意去k个元素,C(n,k)即为这种情况下的方法种数,比如K = 3,S = 10, 则可以形成3个集合: {2,4,6,8,10} , {3,6,9}, {5,10} ,第一个集合C(5,

POJ 2773 Happy 2006 二分+容斥(入门

题目链接:点击打开链接 题意: 输入n ,k 求与n互质的第k个数(这个数可能>n) 思路: solve(mid)表示[1,mid]中有多少个和n互质,然后二分一下最小的mid 使得互质个数==k solve(x) 实现: 与n互质的个数=所有数-与n不互质的数=所有数-(与n有一个因子-与n有2个因子的+与n有3个因子的) 状压n的因子个数,然后根据上面的公式容斥得到. #include <stdio.h> #include <iostream> #include <