Description
懒羊羊是一只非常能吃的羊,它在青青草原上发现一块巨大的正方形草地,但灰太狼已经抢先一步在草地下布上了若干陷阱,正方形草地位于直角坐标系中,左下角坐标为(1,1),右上角坐标为(m,m),草地内只有整数坐标点上才长有青草,懒羊羊发现,对于一棵坐标为(x,y)处的青草,只有(x*y) Mod m>0时,草旁边才有一个陷阱,Mod为取余数
聪明的你是否能帮懒羊羊算一算,这块草地上共有多少陷阱。
Input
输入的第一行为一个正整数T(T<=50),表示测试数据的组数,接下来是T行测试数据,每行中有一个整数m(m<=100000)。
Output
对于每一组测试数据,输出一行"Case id: M",表示从第id组测试数据结果为,id从1开始。
Sample Input
5
1
3
4
6
1403
Sample Output
Case 1: 0
Case 2: 4
Case 3: 8
Case 4: 21
Case 5: 1962964
懒羊羊是一只非常能吃的羊,它在青青草原上发现一块巨大的正方形草地,但灰太狼已经抢先一步在草地下布上了若干陷阱,正方形草地位于直角坐标系中,左下角坐标为(1,1),右上角坐标为(m,m),草地内只有整数坐标点上才长有青草,懒羊羊发现,对于一棵坐标为(x,y)处的青草,只有(x*y) Mod m>0时,草旁边才有一个陷阱,Mod为取余数
聪明的你是否能帮懒羊羊算一算,这块草地上共有多少陷阱。
Input
输入的第一行为一个正整数T(T<=50),表示测试数据的组数,接下来是T行测试数据,每行中有一个整数m(m<=100000)。
Output
对于每一组测试数据,输出一行"Case id: M",表示从第id组测试数据结果为,id从1开始。
Sample Input
5
1
3
4
6
1403
Sample Output
Case 1: 0
Case 2: 4
Case 3: 8
Case 4: 21
Case 5: 1962964
解法:for两次过去超时不用想,既然x*y%m==0,那么就是x*y=k*m,所以两边同时除以gcd(x,m),那么只要再找到含有m/gcd(x,m)因子的y,就可以了,最后算出一列中有多少个y的倍数即可。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
ll t,n,i,j,sum,cas=1;
cin>>t;
while(t--){
cin>>n;
sum=0;
for(i=1;i<=n;i++){
ll f=__gcd(n,i);
f=n/f;
sum+=n/f;
}
cout<<"Case "<<cas++<<": "<<n*n-sum<<endl;
}
return 0;
}