题解:P9238 [蓝桥杯 2023 省 A] 翻转硬币
思路
First
很容易得到一个
Second
设 bool)表示第
容易得到
因为是模
两边同时卷
又因为是模
所以
Third
如果做的题足够多的话,容易得出
所以
改变枚举顺序,则:
用杜教筛求
Proof
那么如何证明
不妨设
- 如果
\forall i \in \left[ 1,k \right ],c_i<2 ,则原等式显然成立(满足d^2 \mid n 的d 只有1 )。 - 否则,显然等式左边为
0 。将所有c_i < 2 的全部扔掉,并且令剩余的c_i = c_i \mod 2 。不妨设最后剩了m 项,则\mu(i) = 1 的个数共有num_1 = \sum_{i=2k}C_{m}^{i} ,\mu(i) = -1 的个数共有num_2 = \sum_{i=2k+1} C_{m}^{i} 。显然num_1 = num_2 ,所以等式右边也是0 。
综上所述,原等式成立。
Code
const int N=2e7+5;
int n,Prime[N],cnt,Mu[N];
bool vis[N];
map<int,int> Map;
void init(int n)
{
int i,j; Mu[1]=1;
for(i=2;i<=n;i++)
{
if(!vis[i]) Prime[++cnt]=i,Mu[i]=-1;
for(j=1;j<=cnt && i*Prime[j]<=n;j++)
{
vis[i*Prime[j]]=1;
if(i%Prime[j]==0)
{
Mu[i*Prime[j]]=0;
break;
}
Mu[i*Prime[j]]=-Mu[i];
}
}
for(i=1;i<=n;i++) Mu[i]+=Mu[i-1];
}
int Mu_SUM(int n)
{
if(n<=2e7) return Mu[n];
if(Map[n]) return Map[n];
int L,R,ans=1;
for(L=2;L<=n;L=R+1)
{
R=n/(n/L);
ans-=(R-L+1)*Mu_SUM(n/L);
}
return Map[n]=ans;
}
int Love_Forever()
{
int L,R,ans=0;
n=read(); init(2e7);
for(L=1;L*L<=n;L=R+1)
{
R=sqrt(n/(n/L/L));
ans+=(n/L/L)*(Mu_SUM(R)-Mu_SUM(L-1));
}
return ans;
}