BJTU 数学

来源:互联网 发布:广州汇丰软件 编辑:程序博客网 时间:2024/05/22 13:37
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;}


0 0
原创粉丝点击