HDU 2841 容斥原理

来源:互联网 发布:热血战歌龙心升级数据 编辑:程序博客网 时间:2024/05/17 22:40
#include <cstdio>#include <iostream>#include <vector>using namespace std;int T, n, m;const int maxn = 1E5 + 10;std::vector<int> prime[maxn];void init(){for (int i = 2; i < maxn; i++)if (!prime[i].size())for (int j = 1; i * j < maxn; j++)prime[i * j].push_back(i);}long long dfs(int m, int n, int idx){long long res = 0;for (int i = idx; i < prime[m].size(); i++)res += n / prime[m][i] - dfs(m, n / prime[m][i], i + 1);return res;}int main(int argc, char const *argv[]){init();scanf("%d", &T);while (T--){scanf("%d%d", &n, &m);long long ans = n;for (int i = 2; i <= m; i++)ans += n - dfs(i, n, 0);printf("%lld\n", ans);}return 0;}


典型的容斥原理题目,N*M的格点上有树,从0,0点可以看到多少棵树。

也就是有多少对互斥的数,预处理出所有的素因子,根据容斥原理,不断加减。

0 0
原创粉丝点击