只做了前三題。。。。。
t1、選數
先把題目轉化為求選n個數最大公約數為1,不用說了。
假定f[i]為選出n個數最大公約數為i的方案數。
由於題目中有條件h-l<=10^5,所以i<=10^5即可。
令l=(l-1)/i, r=h/i
f[i] = (r-l)^n - sigma f[a*i] - (r-l)
最後的r-l為減去全部選擇乙個數的方案數
答案為f[1]
ps:如果範圍中有1,注意f[1]++,因為全部選1也是一種方案
另一種做法,可以直接用莫比烏斯反演,莫比烏斯函式求和可參見我的另一篇博文
這種做法比較卡時,popoqqq大神正是用了種做法
貼上我的**
#include #include #include using namespace std;
const int maxn=100005, mod=(1e9)+7;
int f[maxn],l,r,n,k,i,j;
int qck(int a,int b)
return ret;}
int main()
if (l==1) f[1]++;
printf("%d\n",f[1]);
return 0;
}
t2、網路吞吐量
很經典的一道網路流題了,做法可以參見ahoi2006上學路線,不講了
#include #include #include #include using namespace std;
#define pb push_back
typedef long long ll;
const int inf=1e9;
ll flow[300000],ds[505],dt[505],minx,ans;
int a[1005],js[1005],c[1005];
int node[300000],next[300000];
int n,m,x,y,z,n,i,j,vj,tot,q[1005],l,r;
bool flag,v[505];
struct edge;
vector e[505];
void dijkstra(ll d,int s)}
void add(int x,int y,ll z)
void init()
void sap(int x)
int minn = minx, e = n-1, i;
for (i=a[x];i;i=next[i])
if (flow[i]>0)
e = min(e,c[node[i]]);
} if (flag) flow[i]-=minx, flow[i^1]+=minx;
else }
int main());
e[y].pb((edge));
} dijkstra(ds,1);
dijkstra(dt,n);
for (i=1,tot=1;i<=n;i++)a[maxn],b[maxn];
bool cmp1(const arr &a,const arr &b)
ll query(int p,int q,int l,int r,int s)
return ret;}
int get2(int x)
return ret;}
int main()
sort(w+1,w+m+1);
m = unique(w+1,w+m+1)-w-1;
sort(a+1,a+m+1,cmp1);
sort(b+1,b+m+1,cmp2);
for (i=1;i<=m;i++)
for (i=1;i<=m;i++)
for (i=1,lastans=1;i<=n;i++)
return 0;
}
題解 CQOI2015選數
這題做的時候接連想錯了好多次 但是回到正軌上之後依然是乙個套路題。不過這題好像有比莫比烏斯反演更好的做法,莫比烏斯反演貌似是某種能過的暴力 不過能過也就行了吧哈哈。首先我們把數字的範圍要進行縮小 最大公約數為 k 那自然所有選出來的數都必須是 k 的倍數。所以我們改選數為選擇是 k 的多少倍。然後由...
CCPC2015 部分題解
hdoj5540 secrete master plan 問一張紙片旋轉後能不能和另外一張完全一樣,列舉所有情況即可。1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 1...
CQOI2015 任務查詢系統題解
題目 萌新做的第一道主席樹非模板題,emmm說實話搞得我頭皮發麻,想了乙個下午,最後還是去看了某神犇的題解,但是並沒有看懂,似乎用了樹套樹 主席樹套樹狀陣列,複雜度o nlog2n 最後沒辦法,自己瞎搞居然搞出來乙個o nlog2n 瞬間感覺自己很厲害有木有,雖然我不會別人那些高階演算法,但至少我的...