#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; const int maxn=1e5+10; ll C[maxn]; int prime[maxn]; int num[maxn],tmp_num[maxn]; ll ans[maxn]; int get_prime(int m){ int cnt=0; int ed=(int)sqrt(m+0.5); for(int i=2;i<=ed;i++){ if(m%i==0){ prime[cnt]=i; while(m%i==0){ m/=i; num[cnt]++; } cnt++; } } if(m>1){ prime[cnt]=m; num[cnt]++; cnt++; } return cnt; } int check(int n){ for(int i=0;i<n;i++) if(tmp_num[i]<num[i]) return 0; return 1; } void init(){ memset(num,0,sizeof(num)); memset(tmp_num,0,sizeof(tmp_num)); } int main(){ int n,m; while(scanf("%d %d",&n,&m)==2){ init(); int cnt=get_prime(m); // C[0]=1; int ans_cnt=0; for(int i=1;i<n;i++){ /* 直接算组合数的话,实在太大,会超时 所以把之前的结果留下来就很重要 C[i]=C[i-1]*(n-1-i+1)/i; ll tmp=C[i]; fill(tmp_num,tmp_num+cnt,0); */ ll a=n-1-i+1,b=i; for(int j=0;j<cnt;j++){ if(a%prime[j]==0){ while(a%prime[j]==0){ tmp_num[j]++; a/=prime[j]; } } if(b%prime[j]==0){ while(b%prime[j]==0){ tmp_num[j]--; b/=prime[j]; } } } if(check(cnt)){ ans[ans_cnt++]=i+1; } } /* for(int i=0;i<10;i++){ printf("i:%d %lld\n",i,C[i]); } */ printf("%d\n",ans_cnt); for(int i=0;i<ans_cnt;i++){ if(i==0) printf("%lld",ans[i]); else printf(" %lld",ans[i]); } printf("\n"); } return 0; }
原
想对作者说点什么?
我来说一句
irrelevant Elements (组合数学)uva-1635
题目大意: 对于给定的n个数a1,a2,a3....an,一次求出相邻两个数之和,将得到一个新的数列。重复上述操作,最后结果将变成一个数。问这个数除以m的余数与那些数无关?例如n=3,m=2时,...
uva1635(唯一分解定理,杨辉三角二项式递推公式)
/* translation: 题意见lrj,p320 solution: 唯一分解定理,杨辉三角迭代公式 根据杨辉三角的迭代公式即可很容易得出最后一项的每一项系数。根据是否能够整除m,就可以...

没有更多推荐了,返回首页