P4450 双亲数 题解
提供一种超短的做法
我们设
如何求
我们打一个表观察一下
1 1 1 1 1 1 1 1 1 1
1 2 1 2 1 2 1 2 1 2
1 1 3 1 1 3 1 1 3 1
1 2 1 4 1 2 1 4 1 2
1 1 1 1 5 1 1 1 1 5
1 2 3 2 1 6 1 2 3 2
1 1 1 1 1 1 7 1 1 1
1 2 1 4 1 2 1 8 1 2
1 1 3 1 1 3 1 1 9 1
1 2 1 2 5 2 1 2 1 10
我们设函数
如图,可以很直观的发现
我们可以很直观的发现,
于是我们反向推一下
于是我们就得到了
上代码:
#include<cstdio>
#include<algorithm>
#define int long long
#define N 100000006
using namespace std;
int k,g[N],f[N],ans,n,m,sum,Ch;
signed main(){
scanf("%lld%lld%lld",&n,&m,&Ch);
if(n>m)swap(n,m);
for(int k=n;k>=1;k--){
g[k]=(n/k)*(m/k);
f[k]=g[k];
for(int j=2;j<=(n/k);j++)f[k]-=f[j*k];
}
printf("%lld",f[Ch]);
return 0;
}
算法时间复杂度为