同余定义
若c|(a-b),即(a-b)/c得到整数,称a和b关于模c同余。记作a≡b(mod m)
同余性质
若a≡b(mod x),c≡d(mod x)
1.a+c≡b+d(mod x)
2.a-c≡b-d(mod x)
3.a*c≡b*d(mod x)
若ac≡bc(mod x)
4.a≡b(mod x/(x,c))
同余类定义
若a≡b(mod n),则a和b属于模n的一个同余类。
缩同余类定义
如果一个同余类中所有数和n互质,那么这个同余类就是一个缩同余类。
完全剩余系定义
模n意义下n个同余类各取一个代表组成一个集合。
缩剩余系
模n意义下φ(n)个缩同余类中个取一个代表组成的集合。
求解:
x=a%2016;
y=b%2016;
x*y=(a*b)%2016
如果 (a*b)%2016=0,测满足条件; //(a*b)%2016=(a%2016*b%2016)%2016
ans++;
由于n,m可能大于2016,设数组a[i],b[i]存放余数为i的个数;
则 若满足条件,
ans+=a[i]*b[j];
附代码
#include "iostream"
#include "algorithm"
#include "cstring"
using namespace std;
long long a[5005],b[5005];
int main(){
long long n,m;
while(cin>>n>>m){
long long ans=0;
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]++;
for(int i=0;i<2016;i++)
for(int j=0;j<2016;j++)
if((i*j)%2016==0)
ans+=a[i]*b[j];
cout<<ans<<endl;
}
return 0;
}