您的位置:首页 > 其它

BJTU 数学题

2016-04-24 21:54 483 查看
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

解法: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: