列表

详情


NC205235. 20200524

描述


中北大学于日举办第15届算法与程序设计竞赛,cy觉得是一个很好的数字,所以用出一道题。

给两个正整数

求有多少正整数对, 满足的整数倍。



输入描述

第一行输入一个正整数,表示有组样例。

接下来行,每行输入两个正整数。 

输出描述

对于每组数据,输出一个正整数表示满足正整数对的数量。

示例1

输入:

1
2 20200524

输出:

3

说明:

有3组(a,b)满足,分别是(1,20200524),(2,20200524),(2,10100262)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 588K, 提交时间: 2020-06-02 09:38:54

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int n=20200524,m=24;
const int a[31]={1,2,3,4,6,12,1123,1499,2246,2998,3369,4492,4497,5996,6738,8994,13476,
17988,1683377,3366754,5050131,6733508,10100262,20200524};
int b[31];
int main(){
    int t,x,y;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&x,&y);
        for(int i=0;i<m;i++) b[i]=x/a[i];
        for(int i=m-1;i>=0;i--)
            for(int j=i+1;j<m;j++)
                if(a[j]%a[i]==0) b[i]-=b[j];
        ll ans=0;
        for(int i=0;i<m;i++) ans+=1ll*b[i]*(y/(n/a[i]));
        printf("%lld\n",ans);
    }
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 492K, 提交时间: 2020-06-30 22:59:57

#include<bits/stdc++.h>
using namespace std;

const int num=20200524;
int main()
{
    int i,j,n,m,T,L=0,a[105],V[105];
    long long ans;
    for(i=1;i*i<num;i++)if(num%i==0)a[L++]=i,a[L++]=num/i;
    sort(a,a+L);
    scanf("%d",&T);
    while(T--)
    {
    	scanf("%d%d",&n,&m),ans=0;
		for(i=0;i<L;i++)V[i]=n/a[i];
    	for(i=L-1;i>=0;i--)
    	    for(j=i+1;j<L;j++)if(a[j]%a[i]==0)V[i]-=V[j];
    	for(i=0;i<L;i++)j=num/a[i],ans+=(long long)V[i]*(m/j);
    	printf("%lld\n",ans); 
	}
    return 0;
}

上一题