HDU 5878(打表)

1462 ワード

題意:nの整数を与え、n以上の最小整数mを見つけ、m2^a*3^b*5^c*7^dとして表すことができるようにする.
考え方:四層forループ列挙+打表、最後lower_bound().
注意:ここはprintfを使ったほうがいいです.coutでニンニク客にTLEを渡したほうがいいです.なぜcoutと書いたのか分かりません.tie(0)はcoutでまだ遅い.
#include
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=100000000;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll aa[1001000];

ll qpow(ll x,ll n)
{
    ll res=1;
	while(n>0)
	{
	   if(n%2==1)
	   {
	   	 res=res*x;
	   }
	   x=x*x;
	   n>>=1;
	}
	return res;
}
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    int t,n,tot=0;
    ll temp;
    
        
    for(int d=0;d<15;d++)
    {
        ll dv=qpow(7,d);
        for(int c=0;c<15;c++)
        {
            ll cv=qpow(5,c);
            for(int b=0;b<30;b++)
            {
                ll bv=qpow(3,b);
                for(int a=0;a<30;a++)
                {
                    ll av=qpow(2,a);
                    ll temp=dv*cv*bv*av;
                  //  if(c==0&&b==0&&d==1&&a==1)

                    //    cout<<<>t;
	sort(aa,aa+tot);
    while(t--)
    {
        cin>>n;
        printf("%d
",*lower_bound(aa,aa+tot,n)<