• uva1635


                /*  哑元  组合数的递推整除判断_________________________________________________________________________________
                  
                    #include <iostream> 
                    #include <map> 
                    #include <cmath>
                    #include <vector>
                    #include <cstdio>
                    #include <string>
                    #include <cstring> 
                    #include <algorithm>    
                    using namespace std; 
                    #define fir first
                    #define sec second
                    #define pb(x) push_back(x) 
                    #define mem(A, X) memset(A, X, sizeof A)
                    #define REP(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
                    #define rep(i,l,u) for(int (i)=(int)(l);(i)>=(int)(u);--(i)) 
                    #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e) 
                    typedef int LL;   
                    typedef unsigned long long ull;
                    typedef pair<long,long>  pll;     
                    
                    
                    LL T,n;
                    const int mod=1e9+7; 
                    const int maxn=1e5+10;    
    
                    void pre(LL mm,vector <LL> & mf,map<LL,LL> &fp)//prime_resolve ( mm>=1  )mf m_factor,  fp factor_power  put all  the 素因子(即素数)2  ... of m  to  the  factor,且在factor按照从小到大存储.
                                                {
                                                    mf.clear(); fp.clear();
                                                    if(mm==1) {mf.pb(1); fp[1]=1;} 
                                                    else 
                                                        {
                                                            for(int i=2;i*i<=mm;i++)
                                                            {
                                                                if(mm%i==0)
                                                                { 
                                                                    mf.push_back(i);
                                                                    while(mm%i==0)            //除干净某个因子.
                                                                        {
                                                                            mm/=i;
                                                                            fp[i]++;
                                                                        }
                                                                }
                                                            }
                                                            if(mm!=1)
                                                                {
                                                                  mf.push_back(mm);  //如果m 是素数 放进去
                                                                  fp[mm]++;
                                                                }
                                                        }
                                                }
    
                    int main()
                    {
                         freopen("in.txt","r",stdin); 
                         //while(cin>>n)
                         int n,m;
                         while(cin>>n>>m)
                         { 
                             vector<int> ans;
                             if(m==1)
                                 { REP(i,1,n) ans.pb(i);} 
                             else 
                             {
                           //REP(kase,1,T)  { }
                             vector<int> dm;
                             map<int ,int > pm;
                             pre(m,dm,pm);
    
                             vector<int> curd;
                             map<int,int > curp; 
                             REP(i,1,(n+1)/2)
                             {
                                 vector<int> td; map<int,int>tp;
    
                                 if(i==1) {td.pb(1);tp[1]=1;}
                                 else 
                                 {
    
                                     pre(n-i+1,td,tp); 
                                     
                                     vector<int> tempd; map<int,int> tempp;
                                     pre(i-1,tempd,tempp); 
                                     REP(j,0,tempd.size()-1)
                                     {
                                         int key=tempd[j]; 
                                         tp[key]-=tempp[key];
                                     } 
    
                                 }
    
                                 map<int,int> ::iterator it;
                                 for(it=tp.begin();it!=tp.end();it++)
                                     curp[it->fir]+=it->sec;
                                 int ok=1; 
    
                                 for(it=pm.begin();it!=pm.end();it++)
                                     {
                                         //cout << "-----"<<it->first << endl;
                                         if(it->sec>curp[it->fir]){
    //cout<<"i:"<<i<<endl;
                                          ok=0;break;}//
                                     }
                                 if(ok)
                                 {
                                     //cout<<"i :"<<i<<endl;
                                     ans.pb(i);
                                     if(i!=n-i+1) ans.pb(n-i+1);
                                 } 
                             }
                             sort(ans.begin(),ans.end());
                         }
    
                             cout<<ans.size()<<"
    ";
                             if(!ans.empty())
                             { 
                                     cout<<ans[0];
                                     REP(j,1,ans.size()-1) cout<<" "<<ans[j]; 
                                     
                             }
                             cout<<"
    ";
                         }
                      return 0;
                    }
        
                   /*
                      note    :   组合数的大数字整除递推 C(n,k)=C(n,k-1)(n-k+1)/k,如果递推式没有除法可以直接进行余数的递推,但是这个里面的递推式中的分母是k,模是某个值m,
                                      而k,m不一定互素,所以不一定可逆。但是极端的去想:如果给的m是一个素数的话可以利用这个性质推出2 到 k-1项。   
                      debug   :   pe了好几次    最后是当没有哑元的时候也要输出一个空行。
                      optimize:
                    */ 
  • 相关阅读:
    干货分享:QQ群排名霸屏优化规则靠前的新技术
    QQ群排名优化到霸屏的策略怎么做?
    百度知道芝麻将,申请资格&权限介绍&奖惩制度(简剖)
    新媒体运营之如此微信养号不易封
    知道引流于需求之上 势必更为精准有效
    价值内容争夺背后的流量推荐 以及利润分发逻辑
    深度剖析:自媒体爆文十大标题写法
    据统计:90%的爆文都这样敲出来滴
    短视频不为人知的素材来源 以及平台推荐的黑盒机制
    说什么月入几万 我是不是应该一头撞死?
  • 原文地址:https://www.cnblogs.com/paulzjt/p/6073186.html
Copyright © 2020-2023  润新知