uva 4683

这题的意思是给一个集合,最多有12个元素。

找出仅仅能被集合中一个仅且一个数整除的第n个数。

(n <= 10^15)。

我用容斥原理做的。先把能被每一个数整除的元素个数累加,当然会有反复的。若某个数由集合中两个数组成,那么要减去全部这个数的整数倍,并且要减两次,由于他是两个数的公约数,而当某个数是当中三个数的公约数,那他一定也是两个数的公约数,这样就多减了c[k][2]个,就得加上。以此类推。

要求第n个数,题目说答案最大是10^15,我以10^15为界限进行二分。对于[1,m]内若符合条件的数是res个。若res >= n,那么high = mid-1,否则low = mid+1。

可是我的代码没过,无限TLE。。代码先贴这里。希望路过的大神给予指点。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
//#define long long __int64
//#define LL long long
#define eps 1e-9
#define PI acos(-1.0)
//typedef __int64 LL; using namespace std;
const long long Max = 1000000000000000;
int k;
long long n;
int a[15];
long long C[15][15]; long long gcd(long long a, long long b)
{
if(b == 0) return a;
return gcd(b,a%b);
}
long long lcm(long long a, long long b)
{
return a/gcd(a,b)*b;
} void init()
{
memset(C,0,sizeof(C));
for(int i = 1; i <= 12; i++)
{
for(int j = 0; j <= i; j++)
{
if(j == 0 || j == i)
C[i][j] = 1;
else if(j == 1)
C[i][j] = i;
else
C[i][j] = C[i-1][j-1] + C[i-1][j];
}
}
} long long cal(long long m)
{
long long ans = 0; for(int i = 1; i < (1<<k); i++)
{
int cnt = 0;
long long mul = 1;
for(int j = 0; j < k; j++)
{
if(i&(1<<j))
{
cnt++;
mul = lcm(mul,a[j]);
}
}
if(cnt&1)
ans += C[k][cnt-1]*(m/mul);
else
ans -= cnt*(m/mul);
}
return ans;
} int main()
{
int test;
init();
scanf("%d",&test);
while(test--)
{
scanf("%d %I64d",&k,&n);
for(int i = 0; i < k; i++)
{
scanf("%d",&a[i]);
}
long long low = 0,high = Max;
while(low <= high)
{
long long mid = (low + high)/2;
long long res = cal(mid);
if(res >= n)
high = mid-1;
else
low = mid+1;
}
printf("%I64d\n",low);
}
return 0;
}

最新文章

  1. Winform MDI窗体容器、权限、简单通讯
  2. Discuz论坛安全加固浅析
  3. rspec中的shared_examples与shared_context有什么不同
  4. Multipath多路径冗余全解
  5. android selector详解
  6. Python使用MySQL数据库的方法以及一个实例
  7. Java中各种排序算法
  8. php代码中的细节问题
  9. [翻译]【目录】编写高性能 .NET 代码
  10. JDBC、DBUtils
  11. C#二维码与条形码的生成
  12. Phpstorm-远程连接服务器实时编辑代码
  13. 解决:sudo: pip: command not found
  14. Glide加载图片报错You must not call setTag() on a view Glide is targeting
  15. 我想要得那块牌—记烟台大学第一届&quot;ACM讲堂&quot;
  16. python学习笔记之二
  17. JavaScript 延时与定时
  18. HDU1828 Picture 线段树+扫描线模板题
  19. 系统日志服务rsyslog
  20. springboot 默认tomcat配置

热门文章

  1. netpbm开机logo制作工作【转】
  2. 原生mysql读出来数据有乱码
  3. OpenCASCADE 包说明
  4. [转]Java设计模式学习心得
  5. Android Material Design之CollapsingToolbarLayout使用
  6. hadoop基础学习
  7. (转)Oracle分区表和索引的创建与管理
  8. 用来生成get set string 方法
  9. 逐步理解Java中的线程安全问题
  10. 关于layui 三级联动 渲染报错解决方法