思路:
我们可以将a,b分解为 a=k1∗2016+i b=k2∗2016+j 
所以我们可以推出,使得 a∗b==0(mod2016) 只需  i*j == 0 (mod 2016) 
所以我们只需在2016内遍历i,j即可,然后计算出第一个数有多少个i,第二个数有多少个j,相乘计入答案。这样就避免了容斥,极大的简化了思考过程。(话说一开始想容斥卡了半天。。)
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
typedef long long int lli;
using namespace std;
lli n,m;
int vis[2017];
int main(){
    while(~scanf("%lld%lld",&n,&m)){
        lli ans = 0;
        for(int i = 1;i <= 2016;i++){
            for(int j = 1;j <= 2016;j++){
                if(i*j % 2016 == 0){
                    ans += (n/2016 + (n%2016 >= i)) * (m/2016 + (m%2016 >= j));
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
} 
                   
                   
                   
                   
                            
 
                             
                             本文介绍了一种解决特定模数问题的方法,通过将问题分解并简化思考过程来找到有效解决方案。利用遍历技术和数学推导,该方法能够高效地计算满足条件的数对数量。
本文介绍了一种解决特定模数问题的方法,通过将问题分解并简化思考过程来找到有效解决方案。利用遍历技术和数学推导,该方法能够高效地计算满足条件的数对数量。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   142
					142
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            