您的位置:首页 > 理论基础

2016 CSU 1803 (思路)

2017-08-11 19:49 197 查看
1803: 2016

Time Limit: 5 Sec Memory Limit: 128 Mb Submitted: 1492 Solved: 844

Description

给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:

1. 1≤a≤n,1≤b≤m;

2. a×b 是 2016 的倍数。

Input

输入包含不超过 30 组数据。

每组数据包含两个整数 n,m (1≤n,m≤109).

Output

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

Sample Input

32 63

2016 2016

1000000000 1000000000

Sample Output

1

30576

7523146895502644

Hint

Source

湖南省第十二届大学生计算机程序设计竞赛

【思路】:

【代码】:

#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
vector<int> pile[30];
int main()
{
int p=0;
for(int i=1;i<=2016;i++){
for(int j=1;j<=2016;j++){
if((i*j)%2016==0)p++;
}
}
long long n,m;
while(~scanf("%lld %lld",&n,&m)){
long long x,y,a,b,ans=0,sum=0,qus=0,flag;
x=n/2016;
y=m/2016;
a=n%2016;
b=m%2016;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
if((i*j)%2016==0)sum++;
}
}
for(int i=1;i<=a;i++){
for(int j=1;j<=2016;j++){
if((i*j)%2016==0)ans++;
}
}
for(int i=1;i<=b;i++){
for(int j=1;j<=2016;j++){
if((i*j)%2016==0)qus++;
}
}
flag=x*y*p+sum+ans*y+qus*x;
printf("%lld\n",flag);
}
return 0;
}
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
vector<int> pile[30];
int main()
{
int p=0;
for(int i=1;i<=2016;i++){
for(int j=1;j<=2016;j++){
if((i*j)%2016==0)p++;
}
}
long long n,m;
while(~scanf("%lld %lld",&n,&m)){
long long x,y,a,b,ans=0,sum=0,qus=0,flag;
x=n/2016;
y=m/2016;
a=n%2016;
b=m%2016;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
if((i*j)%2016==0)sum++;
}
}
for(int i=1;i<=a;i++){
for(int j=1;j<=2016;j++){
if((i*j)%2016==0)ans++;
}
}
for(int i=1;i<=b;i++){
for(int j=1;j<=2016;j++){
if((i*j)%2016==0)qus++;
}
}
flag=x*y*p+sum+ans*y+qus*x;
printf("%lld\n",flag);
}
return 0;
}


大佬的题解:



【分析】
a*b%2016=0,预处理一下a,b中分别有多少个1的倍数,2的倍数,3的倍数...
然后枚举一下2016*2016就可以了......
【代码】:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
long long a[3000];
long long b[3000];
int main()
{
long long n,m;
while(~scanf("%lld%lld",&n,&m))
{
for(int i=0;i<2016;i++) a[i]=n/2016,b[i]=m/2016;
for(int i=1;i<=n%2016;i++) a[i]++;
for(int i=1;i<=m%2016;i++) b[i]++;
long long ans=0;
for(int i=0;i<2016;i++)
for(int j=0;j<2016;j++)
if(i*j%2016==0)
ans+=a[i]*b[j];
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 计算机 设计