交表 Send a Table
题目描述
输入格式
输出格式
样例 #1
样例输入 #1
2
5
0
样例输出 #1
3
19
分析
根据题目意思,最后留下来的那些数对都有一个特点 __gcd(x,y) == 1,即xy互质。
所以问题就等于以某个数作为数对的第一个数,那么与它互成素数的小于它的整数有多少个?
怎么求1~nz中与n互质的整数的数量呢?
用欧拉函数啊!
最后我们只要把这些数加起来乘以二(因为两两可以互换),再加上1( 数对(1, 1) )就是最终答案啦。
代码:
#include<bits/stdc++.h>
using namespace std;
long long a[100000];
int n;
void phi(int n)//欧拉函数
{
memset(a,0,sizeof(a));
a[1]=1;
for(int i=2;i<=n;i++)
{
if(a[i]==0)
{
for(int j=i;j<=n;j+=i)
{
if(a[j]==0)
{
a[j]=j;
}
a[j]=a[j]/i*(i-1);
}
}
}
}
int main()
{
while(cin>>n)
{
if(n==0)
{
break;
}
phi(n);
long long ans=0;
for(int i=2;i<=n;i++)
{
ans+=a[i];
}
cout<<ans*2+1<<endl;
}
return 0;
}
结束啦~