容斥原理CSU 2140: Rikka's function

举报
用户已注销 发表于 2021/11/19 01:58:03 2021/11/19
【摘要】 目录 一,容斥原理 二,OJ实战 CSU 2140: Rikka's function CSU 1803: 2016 UVA - 10325 The Lottery 一,容斥原理   二,OJ实战 CSU 2140: Rikka's function 题目: 思路: 代码: #inclu...

目录

一,容斥原理

二,OJ实战

CSU 2140: Rikka's function

CSU 1803: 2016

UVA - 10325 The Lottery


一,容斥原理

 

二,OJ实战

CSU 2140: Rikka's function

题目:

思路:

代码:


  
  1. #include<iostream>
  2. using namespace std;
  3. int p = 1000000007;
  4. long long f[1000005];
  5. long long get_mi(long long n, int k)
  6. {
  7. if (k == 0)return 1;
  8. long long r = get_mi(n, k / 2) % p;
  9. r = (r*r) % p;
  10. if (k % 2)r = (r*n) % p;
  11. return r;
  12. }
  13. int main()
  14. {
  15. int n, m;
  16. cin >> n >> m;
  17. f[m] = m, f[m + 1] = 1;
  18. for (int i = m - 1; i >= 1; i--)f[i] = f[i + 1] * i%p;
  19. long long s = 0, t = get_mi(f[1], p - 2) % p;
  20. for (int i = 0; i <= m; i++)
  21. {
  22. long long r = t;
  23. if (i % 2)r *= -1;
  24. r = r*f[i+1] % p;
  25. r = r*f[m-i+1] % p;
  26. r = r*get_mi(m - i, n) % p;
  27. s += r;
  28. }
  29. s = s%p + p;
  30. cout << s%p << endl;
  31. return 0;
  32. }

CSU 1803: 2016

题目:


Description

 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:
1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。
Input

输入包含不超过 30 组数据。
每组数据包含两个整数 n,m (1≤n,m≤10 9).
Output
对于每组数据,输出一个整数表示满足条件的数量。
Sample Input
32 63
2016 2016
1000000000 1000000000
Sample Output
1
30576
7523146895502644

这个题目直接枚举g=gcd(a,2016)即可
2016=2*2*2*2*2*3*3*7,所以g有6*3*2=36种情况。

对于每个g,求a满足gcd(a,2016)恰好是g,求b使得2016| a*b

一,求a满足gcd(a,2016)恰好是g

即求1,2,3......n/g这些数中,有多少个和2016/g互质,用容斥原理即可

二,求b使得2016| a*b

即求1,2,3......m这些数中,有多少个是2016/g的倍数,答案就是m*g/2016

代码:
 


  
  1. #include<iostream>
  2. using namespace std;
  3. int n, m;
  4. long long f(int g)
  5. {
  6. int nn = n / g;
  7. long long s = nn - (1008 % g == 0)*nn / 2 - (672 % g == 0)*nn / 3 - (288 % g == 0)*nn / 7;
  8. s += (336 % g == 0)*nn / 6 + (96 % g == 0)*nn / 21 + (144 % g == 0)*nn / 14 - (48 % g == 0)*nn / 42;
  9. long long gg = g;
  10. return gg*m / 2016 * s;
  11. }
  12. long long f7(int g)
  13. {
  14. return f(g) + f(g * 7);
  15. }
  16. long long f5(int g)
  17. {
  18. return f7(g) + f7(g * 3) + f7(g * 9);
  19. }
  20. int main()
  21. {
  22. while (cin >> n >> m)cout << f5(1) + f5(2) + f5(4) + f5(8) + f5(16) + f5(32) << endl;
  23. return 0;
  24. }

UVA - 10325 The Lottery

题目:

用了状态压缩来枚举2^m种状态,用k对应状态。

注意一个细节,当r超过n时,r/n就已经是0了,就不要再继续求lcm了,否则会越界,因为多个数的lcm很容易超过long long的范围。

代码:


  
  1. #include<iostream>
  2. using namespace std;
  3. int gcd(int a, int b)
  4. {
  5. if (b)return gcd(b, a%b);
  6. return a;
  7. }
  8. int main()
  9. {
  10. int n, m, l[15], s;
  11. while (cin >> n >> m)
  12. {
  13. s = 0;
  14. for (int i = 0; i < m; i++)cin >> l[i];
  15. for (int k = 0; k < (1 << m); k++)
  16. {
  17. long long r = 1, b = 0;
  18. for (int i = 0; i < m; i++)if (k&(1 << i))
  19. {
  20. if (r <= n)r *= l[i] / gcd(l[i], r);
  21. b++;
  22. }
  23. if (b % 2)s -= n/r;
  24. else s += n/r;
  25. }
  26. cout << s << endl;
  27. }
  28. return 0;
  29. }

 

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/115913678

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。