【zzulioj 2135】 这里是天堂!

  当a+b<m+n时,k一定等于a+b,不然概率为0;

Input

率先行有二个大背头T,代表有T组数据(1<=T<=3000)

每组数据有多少个整数n,m,k,a,b,个中0<=n,m,k,a,b<=10

 

 

Mophues


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K
(Java/Others)
Total Submission(s): 1669    Accepted Submission(s): 675
 


Problem Description

As we know, any positive integer C ( C >= 2 ) can be written as the
multiply of some prime numbers:
    C = p1×p2× p3× … × pk
which p1, p2 … pk are all prime numbers.For example, if C = 24,
then:
    24 = 2 × 2 × 2 × 3
    here, p1 = p2 = p3 = 2, p4 = 3, k = 4

Given two integers P and C. if k<=P( k is the number of C’s prime
factors), we call C a lucky number of P.

Now, XXX needs to count the number of pairs (a, b), which 1<=a<=n
, 1<=b<=m, and gcd(a,b) is a lucky number of a given P ( “gcd”
means “greatest common divisor”).

Please note that we define 1 as lucky number of any non-negative
integers because 1 has no prime factor.

 

 


Input

The first line of input is an integer Q meaning that there are Q test
cases.
Then Q lines follow, each line is a test case and each test case
contains three non-negative numbers: n, m and P (n, m, P <=
5×105.
Q <=5000).

 

 


Output

For each test case, print the number of pairs (a, b), which
1<=a<=n , 1<=b<=m, and gcd(a,b) is a lucky number of
P.

 

 


Sample Input

2

10 10 0

10 10 1

 

 


Sample Output

63

93

 

 


Source

2013 ACM/ICPC Asia Regional Hangzhou
Online

 

 


Recommend

liuyiding   |   We have carefully selected several similar problems for
you:  365bet官方开户,6022 6021 6020 6019 6018 

bet365注册网址, 

//Source:


Description(题意):

其余整数C ( C >= 2 )都能够写成素数之积
C = p1×p2× p3× … × pk
其中, p1, p2 … pk 是素数。如 C = 24, 则 24 = 2 × 2 × 2 × 3, 其中, p1 = p2 = p3 = 2, p4 = 3, k =

  1. 365bet体育平台,给定两整数 P和 C, 若 k<=P ( k是 C的素因子个数),称 C是P的大幸数.
    现小X需总计的点对 (a, b)的个数,当中1<=a<=n , 1<=b<=m,
    gcd(a,b)是 P的大幸数 ( “gcd”是最大公因数).
    细心:因为1无素因子,定义1为其余非负数的好运数.

 

Input

    首行有一个整数 T,表示有 T 组测量试验数据.接下去有T行,每行是一种测量试验数据,含3个非负整数n, m 与P (n, m, P <= 5×105. T <=6000).

Output

    对各种测验数据,输出对 (a, b)的个数,在那之中 1<=a<=n , 1<=b<=m,
且 gcd(a,b) 是 P的幸运数.

Sample
Input

2

10 10 0

10 10 1

Sample
Output

63

93

365bet官方开户 1

 

//num[j]记录j的因子数。
//g[j][num[i]]用于计算具有相同个数的素因子的i的?(j/i)之和,
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int M=5e5+5,N=19;
int n,m,p,T,g[M][N],num[M];
int tot,prime[M/3],mu[M];bool check[M];
int calc(int y,int x){
    int res=0;
    while(!(y%x)) y/=x,res++;
    return res;
}
void sieve(){
    n=5e5;mu[1]=1;
    for(int i=2;i<=n;i++){
        if(!check[i]) prime[++tot]=i,mu[i]=-1;
        for(int j=1;j<=tot&&i*prime[j]<=n;j++){
            check[i*prime[j]]=1;
            if(!(i%prime[j])){mu[i*prime[j]]=0;break;}
            else mu[i*prime[j]]=-mu[i];
        }
    }
    for(int i=2;i<=n;i++) if(!num[i]) for(int j=i;j<=n;j+=i) num[j]+=calc(j,i);
    for(int i=1;i<=n;i++) for(int j=i;j<=n;j+=i) g[j][num[i]]+=mu[j/i];
    for(int i=1;i<=n;i++) for(int j=1;j<19;j++) g[i][j]+=g[i][j-1];
    for(int i=1;i<=n;i++) for(int j=0;j<19;j++) g[i][j]+=g[i-1][j];
}
ll solve(int n,int m,int p){
    if(p>=19) return 1LL*n*m;
    if(n>m) swap(n,m);
    ll ans=0;
    for(int i=1,pos=0;i<=n;i=pos+1){
        pos=min(n/(n/i),m/(m/i));
        ans+=1LL*(n/i)*(m/i)*(g[pos][p]-g[i-1][p]);
    }
    return ans;
}
int main(){
    sieve();
    for(scanf("%d",&T);T--;){
        scanf("%d%d%d",&n,&m,&p),
        printf("%I64d\n",solve(n,m,p));
    }
    return 0;
}

 

先思索当前情形可行与否:

【zzulioj 2135】 这里是西方!,zzulioj2135天堂

先思考当前情形可行与否:

  假设当a>n或然b>m时是相对不行的,可能率为0;

  当a+b<m+n时,k一定等于a+b,不然概率为0;

  当a+b==m+n时,k>=a+n,不然可能率为0;

接下去正是求三个可能率,思索到猫猫来到的一一对答案没有影响,所以可径直行使古典概型,也即求可行的方案数除以总方案数。

一蹴而就的方案数为从n里面挑选a个的方案乘上从m里面挑选b个的方案数,总方案数为从m+n里面挑选a+b个的方案数。也即C(n,a)*C(m,b)/C(n+m,a+b)。

鉴于数量十分的小,所以能够直接用组合数的递推公式求出答案,然后分别作为成员分母约分一下就足以了。

 

  假使当a>n或然b>m时是纯属不行的,可能率为0;

HINT

破例的,概率为0的分数表示法为0/1。

 

 1 #include <iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<vector>
 5 #include<set>
 6 #include<map>
 7 #include<stack>
 8 #include<queue>
 9 #include<list>
10 #include<cmath>
11 #include<algorithm>
12 #include<cstdio>
13 #include <bitset>
14 #include <climits>
15 #include <time.h>
16 #include<iomanip>
17 #define INF 0x3f3f3f3f
18 using namespace std;
19 #define ll long long
20 
21 ll C(int num1,int num2)
22 {
23     if(num2==0) return 1;
24 
25     ll res1 = 1;
26     ll res2 = 1;
27     for(int i=1;i<=num2;i++)
28     {
29         res1*=(num1-i+1);
30         res2*=i;
31     }
32     return res1/res2;
33 }
34 
35 
36 int main()
37 {
38     //freopen("D://in.txt","r",stdin);
39     //freopen("D://out.txt","w",stdout);
40     int T;
41     scanf("%d",&T);
42     while(T--)
43     {
44         int n,m,k,a,b;
45         scanf("%d%d%d%d%d",&n,&m,&k,&a,&b);
46         if(a>n||b>m)
47         {
48             printf("0 1\n");
49             continue;
50         }
51         if(a+b<n+m&&k!=a+b)
52         {
53             printf("0 1\n");
54             continue;
55         }
56         if(a+b==n+m&&k<a+b)
57         {
58             printf("0 1\n");
59             continue;
60         }
61         ll res1 = C(n,a)*C(m,b);
62         ll res2 = C(n+m,a+b);
63 
64         ll g = __gcd(res1,res2);
65         res1/=g;
66         res2/=g;
67         printf("%lld %lld\n",res1,res2);
68     }
69     return 0;
70 }

 

2135】 这里是上天!,zzulioj2135天堂
先驰念当前情形可行与否: 借使当an恐怕bm时是纯属不行的,可能率为0;
当a+bm+n时,k一定等于…

Description

Maple他打代码打累了,于是Maple跑去找猫猫们来拯救本身。

Maple来到了一个空房内,房间的周边是一个有为数非常多只小猫的房间,在Maple的房内有三个开关,每便按一下按键,就能够有且独有一只小猫从旁边的房内跑过来找Maple玩,当然当隔壁房间未有猫的时候并不会有小猫跑过来。

Maple按了四遍按键后意识跑过来的猫咪只有青古铜色和色情二种毛色,並且假如假使当每便按按键后一侧房间剩下的猫跑过来的可能率都一样,那么Maple就从头想,如若当隔壁房间共有n只白猫和m只黄猫时,当她按了k次开关后,跑过来的白猫数量和黄猫数量分别为a只和b只的票房价值是有一些。

 

 

Output

对此每组数据,获得的概率为二个分数A/B(A<=B且AB为互质整数),输出五个整数A、B,用一个空格分开。

 

 

 

Sample Input

2 1 1 1 1 0 9 1 10 9 1

发表评论

电子邮件地址不会被公开。 必填项已用*标注