注意题目中一旦有大于1e9的数字,所有变量全用Longlong替代,包括i,j
或者一开始直接define int longlong ,然后之后主函数用int32_t,输入输出用int32_t替代
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll INF=1e18+7; ll p[1000010]; ll c[1000010]; ll res=INF; int main() { ll n,x; scanf("%lld%lld",&n,&x); if(n==1) { printf("0 "); return 0; } int m=0; for(int i=2;1LL*i*i<=x;i++)//一旦出现大于10^9的数字,所有变量(包括i,j都要用long long),惨痛的教训 { printf("%d ",i); if(x%i==0){ p[++m]=i,c[m]=0; while(x%i==0) x/=i,c[m]++; } } if(x>1) p[++m]=x,c[m]=1; int tot=0; //printf("*** "); for(int i=1;i<=m;i++) { ll tmpn=n; ll num=0; //printf("**** "); while(tmpn) { //printf("%d ",++tot); num+=tmpn/p[i]; tmpn/=p[i]; } num/=c[i]; res=min(num,res); } printf("%lld ",res); }