這個行向量顯然就是莫比烏斯函式啦,好蠢的隱藏方法= =
然後我們嘗試二分,二分的話要求乙個這個東西
\(h(n) = \sum_^ \mu(i) == d\)
當然\(\mu(x)\)由於一些很好的性質,這個東西可以用分類討論做出來
眾所周知,求\(\mu\)不為0的數的方法就是容斥求無平方因子數
\(g(n) = \sum_^} \mu(i) \lfloor \frac} \rfloor\)
這樣我們已經可以快速求得\(\mu(i) = 0\)的位置有多少了,就是\(n - g(n)\)
再求乙個\(f(n)\)作為莫比烏斯函式的字首和,也就是1和-1的差值
可以用\(f(n)\)和\(g(n)\)和一點特判快速求出來1和-1的個數,顯然\(f(n)\)需要的複雜度 遠大於\(g(n)\),是\(o(n^)\)的
夢想選手快樂的寫了一發,只過了d = 0的點,慘兮兮
然後經過努力的嘗試,發現如果\(r - l < 10^\)的時候停止二分,轉而改為通過類似埃氏篩的方法暴力求這\(10^\)個位置的mu函式,然後挨個列舉看看**是答案
這樣的話可以在3s左右通過了
#include #define fi first
#define se second
#define pii pair#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define maxn 1000005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
templatevoid read(t &res)
while(c >= '0' && c <= '9')
res *= f;
}templatevoid out(t x)
if(x >= 10)
putchar('0' + x % 10);
}int prime[10000005],tot,mu[10000005],m[10000005];
int c[10000005];
int64 val[10000005];
bool nonprime[10000005];
struct hash e[10000005];
int sume,head[1000000],mo = 974711;
void add(int64 x,int64 v)
int64 query(int64 x)
return -1e18;
}}hsh;
mapzz;
int64 f(int64 n)
//zz[n] =res;
hsh.add(n,res);
return res;
}int64 g(int64 n)
return ans;
}int getmu(int64 x)
}if(x != 1) r = -r;
return r;
}int64 check(int64 n,int d)
int main()
for(int j = 1 ; j <= tot ; ++j)
m[i] = m[i - 1] + mu[i];
}int64 d,k;
read(d);read(k);
int64 l = 1,r = 1e10;
while(r - l > 1e6)
for(int i = 0 ; i <= r - l ; ++i)
for(int i = 1 ; i <= tot ; ++i) }}
int64 x = check(l - 1,d);
for(int i = 0 ; i <= r - l ; ++i)
}//printf("%.3lf\n",1.0 * clock() / clocks_per_sec);
return 0;
}
51nod 1573 分解 矩陣快速冪
51nod 演算法馬拉松17 告別奧運 b 分解 51nod 演算法馬拉松17 告別奧運 b 分解 題意 給出乙個 n 問 1 2 n能否拆成m m 1 的形式,如果能,輸出 m 否則輸出 no。想法觀察 1 2 n,它總能寫成a b2 的形式,如果a2 n m,2 b2 n m 1 或者a2 n ...
51nod 1537 分解(矩陣快速冪)
參考 標程中提到了構造對偶式,我去,這咋整啊,搞不了 但是就根據標程來推,這些東西都能推出來。奇偶都能推出來sqrt m sqrt m 1 a b sqrt 2 然後根據 1 2 n a b 2打個表,找規律就好了。找不到規律的話,拿著序列去oeis一查就知道了 include using name...
51Nod 1537 分解(矩陣快速冪)
博主鏈結 給乙個n,求出對應m滿足 1 sqrt 2 n sqrt m sqrt m 1 可以將 1 sqrt 2 n一項項拆開後發現 sqrt 1 sqrt 2 sqrt 9 sqrt 8 sqrt 49 sqrt 50 sqrt 492 9 sqrt 492 10 發現如果n為奇數f n f n...