hdu 1695 一道綜合性很強的數論題

2022-08-17 23:36:13 字數 1640 閱讀 6327

這題想了好久,**也打了好久。挺不錯的一道數論題。

題目是要求兩個集合(1...b, 1...d)中有多少對數的最大公約數為k,此問題等價於求兩個集合(1...b/k,1...d/k)中有多少對數互質。

不妨設b①(1...b)與(1...b)中有多少對數互質

②(1...b)與(b+1...d)中有多少對數互質

問題1就是尤拉函式的應用,就不詳細說了。

對於問題2,直接求不好求,我們倒過來想。對於(b+1...d)中的每乙個y,要想知道(1...b)中有多少數與它互質,我們只需要知道多少個數與它不互質即可。而兩個數不互質就意味著它們有公因子。對於每乙個y的因子f,都能確定地知道(1...b)中有多少個數含有因子f,用容斥原理算一下,就能知道(1...b)中有多少個數與y互質了。列舉一下y即可解決問題②了。

/*

* hdu1695/win.cpp

* created on: 2011-12-11

* author : ben

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn = 100005;

const

int maxsqrn = 500;

typedef long

long i64;

int phi[maxn], facts[maxsqrn], prime[maxsqrn], primenum;

void initprime()

}if (j == i) }}

inline int getfacts(int y)

if (y % prime[i] == 0) }}

if(y > 1)

return i;

}void initphi()

for (i = 2; i <= maxn; i += 2)

for (i = 3; i <= maxn; i += 2) }}

}i64 thesame(int end)

return ret;

}i64 dfs(int n, int start, int i)

return res;

}i64 thediff(int b, int d)

return ret;

}int main()

b /= k;

d /= k;

if (b > d)

ans = thesame(b);

ans += thediff(b, d);

printf("

%i64d\n

", ans);

}return

0;}

HDU 3555 我的第一道數字DP

題意就是找0到n有多少個數中含有49。資料範圍接近10 20 dp的狀態是2維的dp len 3 dp len 0 代表長度為len不含49的方案數 dp len 1 代表長度為len不含49但是以9開頭的數字的方案數 dp len 2 代表長度為len含有49的方案數 狀態轉移如下 dp i 0 ...

HDU 1010 比較坑人的一道搜尋題

本人當初只是想到用搜尋做,上手就是bfs結果wa了,後來反應過來只能用dfs來做 提交了21次,全tle,後來在多次努力下找到了大量的陷阱,為還在為此題困擾的人指指路 1.奇偶剪枝 很簡單的乙個概念 設起點座標是bx,by 終點座標是ex,ey 最短路徑是abs bx ex abs by ey 但是...

hdu 1535 難度為3的水題一道

水的一b。20分鐘就敲好了,沒想到 居然敢卡vector!糾結了,為什麼用vector會超記憶體!為什麼啊!搞的我去鳥神的blog學了個靜態鄰接表,用的真變扭!不過還好,雖蛋疼但能ac。include include include include include include include i...