本萌新做到这个题的时候想到了一个新的思路,就是将分子的质因数和分母的质因数分解了,然后指数相减,看k能否整除剩下的数,然后敲完代码后,发现k为质数时没问题,k为合数时全炸了,求大佬看一下有什么问题
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll INF=10000000000;
ll Read(){
ll dx=0,fh=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-') fh=-1;
c=getchar();
}
while(c<='9'&&c>='0'){
dx=dx*10+c-'0';
c=getchar();
}
return dx*fh;
}
ll T,k,n[10005],m[10005],zys[10],Zys[10],cnt;//zys记录k的质因数,Zys表示下标相同的质因数的指数
ll g(ll num,ll K){//ExLucas里的那个把阶乘中的一个质因子踢出来的那个函数
if(K==1) return 0;
if(num<K) return 0;
if(num==K) return 1;
return num/K+g(num/K,K);
}
void fenjie(){//分解质因数
for(ll i=2;i<=k;++i)
if(k%i==0){
zys[++cnt]=i;
while(k%i==0) {
k/=i;
++Zys[cnt];
}
}
}
ll chk(ll x){//算x!中质因子k的指数
ll Chk=INF;
for(ll i=1;i<=cnt;++i)
Chk=min(Chk,g(x,zys[i])/Zys[i]);
if(Chk==INF) Chk=0;
return Chk;
}
ll chk(ll x,ll y){//算x!+y!中质因子k的指数
ll Chk=INF;
for(ll i=1;i<=cnt;++i)
Chk=min(Chk,(g(x,zys[i])+g(y,zys[i]))/Zys[i]);
if(Chk==INF) Chk=0;
return Chk;
}
int main(){
T=Read();k=Read();
for(ll i=1;i<=T;++i)
n[i]=Read(),m[i]=Read();
fenjie();
// printf("%lld %lld %lld %lld\n",zys[1],Zys[1],zys[2],Zys[2]);
for(ll tim=1;tim<=T;++tim){
ll ans=0;
for(ll i=1;i<=n[tim];++i)
for(ll j=1;j<=min(m[tim],i);++j){
//printf("chk(%lld)=%lld,chk(%lld)=%lld,chk(%lld)=%lld\t",i,chk(i),j,chk(j),i-j,chk(i-j));
if(chk(i)-chk(j,i-j)>0){
// printf("++ans\n");
++ans;
}
// else putchar('\n');
}
printf("%lld\n",ans);
}
return 0;
}