1. 程式人生 > >【HDU2683 TCE-frep number system 完全數+二項展開式】

【HDU2683 TCE-frep number system 完全數+二項展開式】

g(n)是n的因子和
A a b 查詢a b區間有多少個n滿足上式。
Q a 查詢a滿不滿足式子
 

參考

#include <bits/stdc++.h>
//#include <iostream>
//#include <cstdio>
#define X 10005
#define inF 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
const int Times=10;
const ll inf= 9223372036854775807;
 int N=1e6+10;
ll primer[maxn],a[maxn];
//int ans[maxn],num[maxn];
 ll  Pow(ll a,ll n)
 {
     ll ans=1;
     while(n)
     {
         if(n&1)
         {
             ans=ans*a;
         }
         a=a*a;
         n>>=1;
     }
     return ans;
 }
 bool Prime(ll n)
 {
     for(int i=2;i<=sqrt(n);++i)
     {
         if(n%i==0)
            return false;
     }
     return true;
 }
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int cnt=0;
    for(int i=2;i<60;++i)  // i=1會得出 1 可 1 不是完全數
    {
        ll ans=Pow(2,i)-1;
        if(Prime(ans))
            a[cnt++]=ans*Pow(2,i-1);   // (充要條件)歐幾里得完全數公式:如果2p−1是素數,則2p−1⋅(2p−1)是完全數
    }
   // ll a[8]={6,28,496,8128,33550336,8589869056,137438691328LL,2305843008139952128LL};
    ll x,y,n;
    char s;
    while(cin>>s)
    {
        if(s=='A')
        {
            cin>>x>>y;
            int sum=0;
            if(x>y)
                x=x^y^(y=x);
            for(int i=0;i<cnt;++i)
            {
                if(x<=a[i]&&a[i]<=y)
                sum++;
            }
            cout<<sum<<endl;
        }
        else
        {
            cin>>n;
            int i=0;
            for(i=0;i<cnt;++i)
            {
                if(a[i]==n)
                {
                        cout<<1<<endl;
                        break;
                }
            }
            if(i==8)
                cout<<0<<endl;
        }
    }
return 0;
}