问题 D: 猫抓老鼠
时间限制: 1 Sec 内存限制: 128 MB
提交: 142 解决: 62
[提交] [状态] [讨论版] [命题人:admin]
题目描述
一个平面直角坐标系上,有一只猫站在原点(0,0),
对于除原点外的每一个(x,y)(|x| <= N , |y| <= N)的位置上都有一只老鼠
假如猫选择了某个方向出击,那么它可以吃掉这个方向上的所有碰见的老鼠
现在问你有多少个方向上恰好有C只老鼠
输入
输入两个整数N, C (1 <= N <= 5000000, 1 <= C <= N)
输出
输出一个整数
样例输入
【样例输入1】
2 2
【样例输入2】
2 1
【样例输入3】
1234 3
样例输出
【样例输出1】
8
【样例输出2】
8
【样例输出3】
180608
#include<bits/stdc++.h>
#define fi first
#define se second
#define FOR(a) for(int i=0;i<a;i++)
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
typedef pair<P,int> LP;
const ll inf=0x3f3f3f3f;
const int N=1e7+10;
const ll mod=998244353;
map<string,ll> mp;
map<string ,int>ml;
ll ans,tot;
int prime[N],phi[N],n,m,did[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!did[i])
{
phi[i]=i-1;
prime[++tot]=i;
}
for(int j=1;j<=tot&&i*prime[j]<=n;j++)
{
did[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
for(int i=1;i<=n;i++)
{
if(n/i==m) ans+=phi[i];
}
ans*=8;
cout<<ans<<endl;
}