E-枚举求和(2020年广东工业大学第十届文远知行杯新生程序设计竞赛)


这道题是一个很简单的枚举题:给定n,m,k求:

符号意义均为数学表达中的一般意义。

符号解释:为防止读不懂符号意义,做符号解释:

gcd(i,j)表示i与j的最大公因数。

表示的是k为gcd(i,j)的因子;

[ ]表示当[ ]内的命题为真,则结果为1,若为假,则为0;例如[ 这道题是一个很简单的枚举题 ]等于1  

输入描述:

第一行输入一个t(1<=t<=100000);表示有t组输入数据

接下来的t行,每行输入n ,m,k;(1<=n,m,k<=1000000)

输出描述:

对于每一行输入数据,输出一个数表示求和后的答案;

输入

2
2 2 1
2 3 2

输出

4
1

解析
其实挺简单的,就是不知道啥叫因子。
一开始就真的信了题目的鬼话一个个枚举,结果tle了……
--假如整数n除以m,结果是无余数的整数,那么我们称m就是n的因子。 需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成立。反过来说,我们称nm的倍数--
所以问题就变成了:有多少个i和j都是k的倍数。
所以直接输出(n/k)*(m/k)就行了。
还要注意数据类型,1e6*1e6用long long.
#include<iostream>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long n,m,k;
        scanf("%lld%lld%lld",&n,&m,&k);
        printf("%lld\n",(n/k)*(m/k));
    }
    return 0;
}

 

posted @ 2020-12-06 18:34  TheWeak  阅读(76)  评论(0编辑  收藏  举报