51 NOD 1024行列の重複しない要素(テクニック)

2346 ワード

転送ゲート1024マトリクスの重複しない要素タイトルソース:Project Eulerのm*nマトリクス.
この行列の第1列はa^b,(a+1)^b,.....(a+n-1)^b第2列はa^(b+1),(a+1)^(b+1),.....(a + n - 1)^(b+1) ……. 第m列はa^(b+m-1),(a+1)^(b+m-1),.....(a+n-1)^(b+m-1)(a^bはaのb次方を表す)
次は4*4の行列です.
2^2=4, 2^3=8, 2^4=16, 2^5=32 3^2=9, 3^3=27, 3^4=81, 3^5=243 4^2=16, 4^3=64, 4^4=256, 4^5=1024 5^2=25, 5^3=125, 5^4=625, 5^5=3125
この行列の中でどれだけ繰り返さない数があるかを聞く(例えば4^3=8^2、これでは繰り返される)
2^2=4, 2^3=8, 2^4=16, 2^5=32 3^2=9, 3^3=27, 3^4=81, 3^5=243 4^2=16, 4^3=64, 4^4=256, 4^5=1024
m = 4, n = 3, a = 2, b = 2.このうち2^4と4^2は重複する要素である.Input入力データは,m,n,a,bの4つの数を含む.中央はスペースで区切られています.m,nは行列の長さと幅(2<=m,n<=100)である.a,bは行列の1番目の要素であり,a^b(2<=a,b<=100)である.Outputは重複しない要素の数を出力します.Input例4 3 2 Output例11
问题解决の考え方:この问题の解法はとても巧みで、もし私达に1组のあまり大きくない数をあげるならば、私达は简単に异なる个数を探し当てることができて、直接1つの集合を使うことができます.しかし、この問題の数はとても大きくて、私たちはどのように彼を縮小しますか?彼は指数的なので、私たちは対数を取ることができて、このように彼を縮小して、My Codeを使うことができます:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <set>
using namespace std;
set <double> s;
int main()
{
    int m, n, a, b;
    while(cin>>m>>n>>a>>b)
    {
        for(int i=a; i<a+n; i++)
        {
            for(int j=b; j<b+m; j++)
            {
                s.insert(1.0*j*log2(1.0*i));
            }
        }
        cout<<s.size()<<endl;
    }
    return 0;
}