[ NOI 2002 ] Robot

本文解析了一道涉及欧拉函数和穆比乌斯函数的数学竞赛题,通过重新定义函数并运用动规思想,详细阐述了解题过程,包括质数集合的选择策略和欧拉函数的计算公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

\(\\\)

Description


5be139f57f614.jpg

5be139f565f1d.jpg

\(\\\)

Solution


垃圾语文题毁我青春

这题其实就是重定义了俩函数....

首先 \(\varphi(1)=0\)

然后 \(2\) 在计算 \(\mu\) 的时候不算做质因子,含 \(2\) 的数 \(\mu\)\(=0\)

\(m\) 的所有因数中 , \(\mu=1,-1,0\)\(\varphi\) 值之和。

\(\\\)

先考虑 \(\mu=1,-1\) 的答案。

根据 \(\mu\) 的定义,此时所有所求的数字都满足,分解质因数每一个质因数的质数至多为 \(1\)

然后 仅对于这些数 欧拉函数就有了一个新的计算公式:
\[ \varphi(n)=n\times {\frac{p_1-1}{p_1}}\times {\frac{p_2-1}{p_2}}\times ...\times {\frac{p_m-1}{p_m}}=(p_1-1)\times (p_2-1)\times ...\times (p_3-1) \]
发现这是一个质数集合选哪些的问题。

注意到每次多选一个质数,所有的数字答案都乘上了相同的数,所以可以直接求答案。

用一种类似动规的写法,依次考虑每一个位置选或不选。

\(ans_1\)表示选奇数个质因子,\(ans_2\) 表示选偶数个质因子的答案。
\[ ans_1+=ans_2\times (p_i-1),ans_2+=ans_1\times (p_i-1) \]
可以思考一下加号连接的含义。

\(\\\)

然后就只需要解决 \(\mu=0\) 的部分了。

关于欧拉函数其实有一个等式
\[ \sum_{d|m}\varphi(d)=m \]
然后问题解决,答案就是 \(m-ans_1-ans_2-1\),之所以多减掉一个 \(1\) 是因为 \(\varphi(1)=0\)

\(\\\)

Code


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10000
#define R register
#define gc getchar
using namespace std;
 
inline int rd(){
  int x=0; bool f=0; char c=gc();
  while(!isdigit(c)){if(c=='-')f=1;c=gc();}
  while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
  return f?-x:x;
}
 
inline int qpow(int x,int t){
    int res=1;
    while(t){
      if(t&1) (res*=x)%=mod;
      (x*=x)%=mod; t>>=1;
    }
    return res;
}
 
int n,m=1,p,cnt,tmp,ansodd,anseven=1;
 
int main(){
  int n=rd();
  for(R int i=1;i<=n;++i){
    p=rd(); cnt=rd();
    (m*=qpow(p,cnt))%=mod;
    if(p>2){
      tmp=ansodd;
      (ansodd+=anseven*(p-1))%=mod;
      (anseven+=tmp*(p-1))%=mod;
    }
  }
  printf("%d\n%d\n%d\n",(anseven-1+mod)%mod,ansodd,((m-anseven-ansodd)%mod+mod)%mod);
  return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9917095.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值