hdu 5297 容斥原理
2015-08-07 19:59
211 查看
很容易想到我们需要这样一个函数f(n)表示的是1~n的数字中在y sequence中的个数,于是可以想到用容斥来做,先假设答案是n然后计算n中y sequence的个数,然后n加上不够的,继续判断,一直迭代求出答案。
小技巧:预处理的时候素数设为负数方便判断容斥的时候是应该加还是减。
小技巧:预处理的时候素数设为负数方便判断容斥的时候是应该加还是减。
#include <iostream> #include <cstring> #include <vector> #include <cstdio> #include <cmath> using namespace std; typedef long long ll; int p[] = {-2,-3,-5,-7,-11,-13,-17,-19,-23,-29,-31,-37,-41,-43,-47,-53,-59,-61,-67}; vector<int> v; void init( int r ) { v.clear(); for ( int i = 0; -p[i] <= r; i++ ) { int bound = v.size(); for ( int j = 0; j < bound; j++ ) { if ( abs( v[j] * p[i] ) <= 63 ) { v.push_back( v[j] * p[i] ); } } v.push_back(p[i]); } } ll cal( ll n ) { ll res = 0; for ( int i = 0; i < v.size(); i++ ) { ll tmp = pow( n + 0.5, 1.0 / abs(v[i]) ) - 1; if ( v[i] < 0 ) res += tmp; else res -= tmp; } return n - res - 1; } int main () { int t; scanf("%d", &t); while ( t-- ) { ll n, cp, tmp; int r; scanf("%I64d %d", &n, &r); init(r); cp = n, tmp = cal(cp); while ( tmp < n ) { cp += n - tmp; tmp = cal(cp); } printf("%I64d\n", cp); } return 0; }
相关文章推荐
- 修改Qweb报表
- 本地安装UFT插件到Chrome
- java注意事项
- latex笔记
- 通讯录实战
- POJ 2109 Power of Cryptography
- 数值的交换
- MVVM(Model-View-ViewModel)框架——avalon。
- MySQL性能调优与架构设计——第3章 MySQL存储引擎简介
- hdoj 4552 怪盗基德的挑战书【求前缀在字符串中出现的次数之和】
- [LeetCode]Reverse Linked List
- 应用程序创建DMG打包发布
- LeetCode #214 Shortest Palindrome
- POJ 2013 Symmetric Order 水
- POJ-1922 Ride to School
- Android Java设置一个图片的颜色为透明色(不显示,不是背景色),可用于无透明通道的ImageView
- ZOJ3818 Pretty Poem(暴力)
- swirl 7: Matrices and Data Frames
- VC程序版本更新后部分客户无法启动
- ACdream 完美数