HDU2683TCE-frep number system(完全数)

前面讲一些关于数论的历史?忽略
题意就是让你找一个满足那个长长式子的数
在这里插入图片描述
有两种问题,一个数问你(x,y)之间有多少个这样的数,一个是问你是不是这个数
左边其实就是一个二项式定理展开式,即是 ( g ( n ) n + n ) n (\frac{g(n)}{n}+n)^n
所以有 g ( n ) = 2 n g(n)=2*n
因为 n n 本身是 n n 的因子
所以其实问题就是问你 n n 是不是完全数
完全数(Perfect number,又称完美数或完备数)是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。—搜狗百科
搜狗百科讲的挺好的
添加链接描述

目前找到的完全数只有50个,所以竞赛需要大可以直接存
然后就投机取巧了亲
n取下列值时, 2 n 1 ( 2 n 1 ) 2^{n-1}*(2^{n}-1) 是前40个完全数:
2,3,5,7,13,17,19,31,61,89,107,127,521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213,19937,21701,23209,44497,86243,110503,132049,216091,756839,859433,1257787,1398269,2976221,3021377,6972593,13466917,20996011;
代码:

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int MX=1e6+7;
const int mod=1e9+7;
using namespace std;
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}
ll __gcm(ll a,ll b){return a*b/__gcd(a,b);}
int top=0,t;
map<pair<int,int>,int>mp;
ll W[10]={6,28,496,8128,33550336,8589869056,137438691328,2305843008139952128};
int main()
{

  ios::sync_with_stdio(0),cin.tie(0);
  int T;
 // Partition();
 // cin>>T;

 char A;
  while(cin>>A)
  {
      if(A=='A')
      {
          ll x,y;
          cin>>x>>y;
          if(x>y)swap(x,y);
          int ans=0;
          for(int i=0;i<8;i++)
          {
              if(W[i]>=x&&W[i]<=y)
                ans++;
          }
          cout<<ans<<endl;
      }
      else{
        ll x;
        cin>>x;
        int tmp=0;
        for(int i=0;i<8;i++)
        {
            if(W[i]==x)
                tmp=1;
        }
        cout<<tmp<<endl;
      }
  }

}

发布了109 篇原创文章 · 获赞 35 · 访问量 6004

猜你喜欢

转载自blog.csdn.net/weixin_43965698/article/details/104194807