這題想了好久,**也打了好久。挺不錯的一道數論題。
題目是要求兩個集合(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...