抽奖

来源:互联网 发布:工具书网络出版总库 编辑:程序博客网 时间:2024/06/10 18:56

Description

现有一抽奖活动,参加抽奖的员工已经按照报名先后顺序进行了编号(编号从1开始)。抽奖办法如下:由一位特邀嘉宾随机抽取两个正整数m,n,然后将与整数m互素(互质)的员工编号按从小到大排成数列,这个数列中的第n项就是本次活动的特等奖获得者。
例如,m=6,n=9
则与m互素的递增数列为:1,5,7,11,13,17,19,23,25,29,…,
这个数列中第9项为25,则编号为25的员工为本次活动的特等奖获得者。
请编写一程序实现上述功能。
Input

第1行:一个整数T(1≤T≤10)为问题数。
接下来有T行,对应每个问题有1行,每行有两个由一个空格分隔的正整数m,n(1≤m,n≤50000)。
Output

对于每个问题,输出一行问题的编号(0开始编号,格式:case #0: 等)。
然后对应每个问题在一行中输出那个特等奖获得者编号。
Sample Input

3
20 7
105 1000
98 3666
Sample Output

case #0:
17
case #1:
2186
case #2:
8553

#include<stdio.h>#define N 500000int count=0;int list[N];void init(int n){    int i,y[N],j,n1,c;    //y数组存放n的约数    for(i=0;i<N;i++)        y[i]=list[i]=0;    for(i=2;i<n;i++)      //求n的约数        if(n%i==0)            list[i]=1;    j=0;    for(i=2;i<n;i++)        if(list[i]==1)    //将n的约数赋给y数组            y[j++]=i;    n1=j;    //记录约数的个数    c=0;    //倍数累加    for(i=0;i<N;i++)                list[i]=1;    list[0]=0;    for(j=0;j<n1;j++)        //每个约数对应删去其中的倍数        for(c=1;c*y[j]<N;c++)            list[c*y[j]]=0;    j=0;    for(i=0;i<N;i++)    //删除数组中的空格        if(list[i]!=0)            list[j++]=i;//  n1=j;//  for(i=0;i<100;i++)//      printf("%d ",list[i]);}int main(){    int T,m,n;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&m,&n);        init(m);        printf("case #%d:\n",count);        printf("%d\n",list[n-1]);    }    return 0;}
0 0
原创粉丝点击