题解 CF493E 【Vasya and Polynomial】
题目传送门
更不好的阅读体验
题意简述
给定正整数
题目分析
显然
设
首先有一个很重要的性质:每个系数都小于等于
- 若存在
p_i>a ,P(t) \geq p_it^i \geq p_i > a ,矛盾。
由上面的证明可以知道当存在
存在 p_i=a
此时多项式只有一项,故
- 若
n=0,P(x)=a 。
将
- 若
n>1,P(x)=p_nx^n 。
将
将
故
注意
将
以下是证明,不过简单来说,就是将
假设存在另一个
两式相减
因为
又因为
以此类推,故
而
与
上面那一堆东西简单来说,就是将
求出
代码
#include<bits/stdc++.h>
using namespace std;
long long T,t,a,b;
long long cnt,tot;
long long ans[65];
bool check(long long x,long long y){//检验P(t)=a
long long tot=0;
long long k=1;
for(long long i=0;i<=cnt;i++){
tot+=k*ans[i];
k*=x;
if(tot>y) return false;
}
return (tot==y);
}
long long cal(long long a,long long b){//计算a^k=b
long long cn=0;
while(b%a==0){
cn++;
b/=a;
}
if(b!=1) return -1;
return cn;
}
int main(){
scanf("%lld%lld%lld",&t,&a,&b);
if(t==1 && a==1 && b==1){//特判无数解
printf("inf");
return 0;
}
if(a==b) tot++;//p_i=a,n=0
if(t==1 && a>1){//p_i=a,n>0
long long tmp=cal(a,b);
if(tmp!=-1 && tmp>1) tot++;
}
if(a>1){//p_i<a
cnt=-1;
long long tmp=b;
while(tmp) ans[++cnt]=tmp%a,tmp/=a;
if(check(t,a)) tot++;
}
printf("%lld",tot);
}