蒟蒻的第一篇题解

可能观感不是很好)

题意简述:

给定正整数 \(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\)

posted @ 2023-08-09 20:24  lnbyn  阅读(15)  评论(0编辑  收藏  举报