蒟蒻的第一篇题解
可能观感不是很好)
题意简述:
给定正整数 \(n,k\),求方程
$ x^k\equiv n\pmod{x+1} $
的解的个数。(其中\(x\)为正整数)
对于50%的数据 \(k=1\)
对于100%的数据 $ 2\le k,n\le 10^{14} $
题目分析:
50%数据分:
-
题目中说50%的数据中 \(k=1\)
即此时方程为 $ x\equiv n\pmod{x+1} $
去除模数可转化为 $ x+y(x+1)=n $
即 $(x+1)-1+y(x+1)=n $
即 $(y+1)(x+1)=n+1 $
直接\(\sqrt{n}\) 求出 \(n+1\) 的因子数 再减一即可(\((x+1)\)不能等于一)
至于求法,求出所有的质因数幂次,每个加一相乘即可
100%数据分
-
此时方程为$ x^k\equiv n\pmod{x+1} $
我们尝试从$ x^k\pmod{x+1} $中找找东西
-
\(k=1\) 时 \(x^1\pmod{x+1}\) 即 \(=x\)
-
\(k=2\) 时 $ x^2\equiv1\pmod{x+1} $(证一下)
-
\(x^2\equiv x(x+1)-x\pmod{x+1}\)
-
即 \(x^2\equiv -x\pmod{x+1}\)
-
即 \(x^2\equiv -x+(x+1)\pmod{x+1}\)
-
$\therefore x^2\equiv1\pmod{x+1} $
-
-
\(k=3\) 时 \(x^3\equiv x^2*x\equiv1*x\equiv x\pmod{x+1}\)
-
\(k=4\) 时 \(x^4\equiv x^2*x^2\equiv1*1\equiv 1\pmod{x+1}\)
-
以此类推,可得:
当\(k\)为奇数时:
\(x^k\equiv x\pmod{x+1}\)
当\(k\)为偶数时:
\(x^k\equiv 1\pmod{x+1}\)
-
回到题目上,可以进行分类讨论:
-
当\(k\)为奇数时,原方程即为
$ x^k\equiv x\equiv n\pmod{x+1} $
即 $x\equiv n\pmod{x+1} $
(与50分数据同解法)
-
当\(k\)为偶数时,原方程即为
$ x^k\equiv 1\equiv n\pmod{x+1} $
即 $1\equiv n\pmod{x+1} $
-
去除模数可转化为 \(1+y(x+1)=n\)
-
即 \(y(x+1)=n-1\)
-
\(\sqrt{n}\) 求出 \(n-1\) 的因子数 再减一即可(同上)
-
-
本人代码(比较丑)
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
signed main()
{
// freopen("A.in","r",stdin);
// freopen("A.out","w",stdout);
int n,k;scanf("%lld%lld",&n,&k);
if(k%2==1){
n++;
}else{
n--;
}
int tmp=n;
int cnt;
int ans=1;
for(int i=2;i*i<=n;i++){
cnt=1;
while(tmp%i==0){
tmp/=i;
cnt++;
}
ans*=cnt;
}
if(tmp!=1){
ans*=2;
}
ans--;
printf("%lld",ans);
return 0;
}
蒟蒻第一篇题解完结撒花
——原发布于 \(2023.2.2\)