GCD

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7002    Accepted Submission(s): 2577

Problem Description
Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output the total number of different number pairs.
Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.

Yoiu can assume that a = c = 1 in all test cases.

 
Input
The input consists of several test cases. The first line of the input is the number of the cases. There are no more than 3,000 cases.
Each case contains five integers: a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as described above.
 
Output
For each test case, print the number of choices. Use the format in the example.
 
Sample Input
2
1 3 1 5 1
1 11014 1 14409 9
 
Sample Output
Case 1: 9
Case 2: 736427
 
Hint

For the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).

 
Source
2008 “Sunline Cup” National Invitational Contest
 
容斥定理、具体见代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
#define N 100000 int tot;
int prime[N+];
bool isprime[N+];
int phi[N+];
void prime_pri()
{
tot=;
phi[]=;
memset(isprime,true,sizeof(isprime));
isprime[]=isprime[]=false;
for(int i=;i<=N;i++)
{
if(isprime[i])
{
prime[tot++]=i;
phi[i]=i-;
}
for(int j=;j<tot;j++)
{
if(i*prime[j]>N) break;
isprime[i*prime[j]]=false;
if(i%prime[j]==)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
{
phi[i*prime[j]]=phi[i]*(prime[j]-);
}
}
}
}
int fatcnt;
int factor[N][];
int getfactors(int x)
{
fatcnt=;
int tmp=x;
for(int i=;prime[i]<=tmp/prime[i];i++)
{
factor[fatcnt][]=;
if(tmp%prime[i]==)
{
factor[fatcnt][]=prime[i];
while(tmp%prime[i]==)
{
factor[fatcnt][]++;
tmp/=prime[i];
}
fatcnt++;
}
}
if(tmp!=)
{
factor[fatcnt][]=tmp;
factor[fatcnt++][]=;
}
return fatcnt;
}
int cal(int n,int m) //求1到n中与m互质的数的个数
{
int tmp,cnt,ans=;
getfactors(m);
for(int i=;i<(<<fatcnt);i++) //0表示不选择因子
{
cnt=;
tmp=;
for(int j=;j<fatcnt;j++)
{
if(i&(<<j))
{
cnt++;
tmp*=factor[j][];
}
}
if(cnt&) ans+=n/tmp;
else ans-=n/tmp;
}
return n-ans;
}
int main()
{
prime_pri();
int T,iCase=;
int a,b,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d",&a,&a,&b,&b,&k);
if(k==) //除0特判
{
printf("Case %d: 0\n",iCase++);
continue;
}
a/=k,b/=k;
if(a>b) swap(a,b);
ll ans=;
for(int i=;i<=b;i++)
{
if(i<=a) ans+=phi[i];
else ans+=cal(a,i);
}
printf("Case %d: %lld\n",iCase++,ans);
}
return ;
}

最新文章

  1. 漫谈TCP
  2. redis原子性读写操作之LUA脚本和watch机制
  3. sql server 索引分析相关sql
  4. 推荐一个 angular 图像加载插件
  5. 4 BOM编程
  6. 【CITE】VS2012程序打包部署
  7. Env:VIM配置
  8. NOIP2004 合唱队列
  9. ros消息时间同步与回调
  10. ECOS-Ecstore mongodb大数据 读写效率优化
  11. Hadoop的配置过程(虚拟机中的伪分布模式)
  12. springMVC导出word模板
  13. SM3杂凑算法Python语言实现——第三部分
  14. 最接近的三数之和(给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数, 使得它们的和与 target 最接近。返回这三个数的和)
  15. 初识Twisted(一)
  16. Oracle 存储过程或函数传入的数值参数number
  17. Luogu P1337 [JSOI2004]平衡点 / 吊打XXX
  18. 基于Centos搭建 Hadoop 伪分布式环境
  19. Matlab基础部分2-数组和矩阵分析
  20. MVC HTML页面使用

热门文章

  1. 怎样下载安装Firebug和使用Firebug
  2. 编译Linux系统下的jrtplib3.9和jthread1.3(arm和ubuntu)
  3. fragment第二次载入就报错
  4. [gradle] is applicable for argument types
  5. Eclipse中设置作者日期等信息
  6. 对日期和时间的处理 NSCalendar
  7. Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
  8. 主题: 为kindsoft编辑器替换SyntaxHighlighter代码高亮,整合DEDECMS
  9. uva 10739
  10. 跟随屏幕滚动层、遮罩层、获取Div相对定位、整个屏幕、html文档的jquery基本操作