求助
查看原帖
求助
95690
苏联大货司机楼主2021/2/5 18:52

本萌新做到这个题的时候想到了一个新的思路,就是将分子的质因数和分母的质因数分解了,然后指数相减,看kk能否整除剩下的数,然后敲完代码后,发现kk为质数时没问题,kk为合数时全炸了,求大佬看一下有什么问题

#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;
}
2021/2/5 18:52
加载中...