topcoder srm 713 div1 -3
2017-05-12 14:18
483 查看
1、给定$n$,问有多少四元组$1\leq a,b,c,d \leq n$满足$a^{b}=c^{d}$,$n \leq 10^{9}$
思路:如果$a^{b}=c^{d}$,那么一定存在$t,x,y$使得$a=t^{x},c=t^{y}$。一旦$t,x,y$确定,那么可以直接计算出二元组$b,d$有多少。对于$t$,若$t>\sqrt{n}$,那么$x=y=1$。若$t\leq \sqrt{n}$那么$x,y$的值不会超过30,暴力枚举即可。
2、给出一个无相连通图,不同的dfs遍历序列有多少种?
思路:令$f[mask][v]$表示已经遍历了状态$mask$,现在在节点$v$ 时可以遍历到的节点状态。$dp[mask][v]$表示遍历了状态$mask$现在在$v$时遍历完所有节点的方案数,那么有$dp[mask][v]=\sum_{t\in v_{adj}}dp[mask|1<<t][t]*dp[f[mask|1<<t][t]][v]$.
思路:如果$a^{b}=c^{d}$,那么一定存在$t,x,y$使得$a=t^{x},c=t^{y}$。一旦$t,x,y$确定,那么可以直接计算出二元组$b,d$有多少。对于$t$,若$t>\sqrt{n}$,那么$x=y=1$。若$t\leq \sqrt{n}$那么$x,y$的值不会超过30,暴力枚举即可。
#include <string.h> #include <stdio.h> #include <vector> #include <string> #include <set> #include <algorithm> #include <map> using namespace std; const int mod=1000000007; set<pair<int,int>> S; class PowerEquation { int gcd(int x,int y) { if(y==0) return x; return gcd(y,x%y); } int get(int x,int y,int n) { int t=gcd(x,y); x/=t; y/=t; if(x==y) return n; if(x>y) swap(x,y); return n/y; } public: int count(int n) { int ans=(long long)n*n%mod; int sq=sqrt(n)+1; for(int t=2;t*t<=n;++t) { long long a=1; for(int x=1;a*t<=n;++x) { a*=t; long long b=1; for(int y=1;b*t<=n;++y) { b*=t; if(S.count(make_pair(a,b))) { continue; } S.insert(make_pair(a,b)); if(a==b&&a>=sq) ans-=n; ans+=get(x,y,n); ans%=mod; } } } ans+=(long long)(n-sq+1)*n%mod; ans%=mod; return ans; } };
2、给出一个无相连通图,不同的dfs遍历序列有多少种?
思路:令$f[mask][v]$表示已经遍历了状态$mask$,现在在节点$v$ 时可以遍历到的节点状态。$dp[mask][v]$表示遍历了状态$mask$现在在$v$时遍历完所有节点的方案数,那么有$dp[mask][v]=\sum_{t\in v_{adj}}dp[mask|1<<t][t]*dp[f[mask|1<<t][t]][v]$.
#include <string.h> #include <stdio.h> #include <vector> #include <string> #include <set> #include <algorithm> #include <map> using namespace std; const int N=14; int n; vector<int> g ; int f[1<<N] ; int dfs(int mask,int v) { if(f[mask][v]) return f[mask][v]; f[mask][v]=mask; for(int i=0;i<(int)g[v].size();++i) { int t=g[v][i]; if(!(mask&(1<<t))) { f[mask][v]|=dfs(mask|(1<<t),t); } } return f[mask][v]; } long long dp[1<<N] ; long long DFS(int mask,int v) { if(f[mask][v]==mask) return 1; if(dp[mask][v]!=-1) return dp[mask][v]; dp[mask][v]=0; for(int i=0;i<(int)g[v].size();++i) { int t=g[v][i]; if(mask&(1<<t)) continue; long long x=DFS(mask|(1<<t),t); long long y=DFS(f[mask|(1<<t)][t],v); dp[mask][v]+=x*y; } return dp[mask][v]; } class DFSCount { public: long long count(vector<string> G) { n=(int)G.size(); for(int i=0;i<n;++i) { for(int j=0;j<n;++j) if(G[i][j]=='Y') { g[i].push_back(j); } } for(int i=0;i<(1<<n);++i) { for(int j=0;j<n;++j) { if(i&(1<<j)) { f[i][j]=dfs(i,j); } } } memset(dp,-1,sizeof(dp)); long long ans=0; for(int i=0;i<n;++i) { ans+=DFS(1<<i,i); } return ans; } };
相关文章推荐
- 【TopCoder】SRM159 DIV2总结
- topcoder srm 702 div1 -3
- Topcoder SRM 683 Div2 - C
- Topcoder SRM 638 DIV 2 (大力出奇迹)
- [容斥 DP] Topcoder SRM 498 DIV1 Hard. FoxJumping
- TopCoder——SRM 516 DIV 2
- TopCoder 350 points 7-SRM 147 DIV 1 105/350 30%
- topcoder srm 305 div1
- TopCoder SRM 649 Div2 Problem 1000 - XorSequenceEasy (思维)
- TopCoder SRM 652 Div2 Problem 1000 - NoRightTurnDiv2 (几何 + 贪心)
- topcoder SRM 591 DIV2 TheArithmeticProgression
- topcoder srm 710 div1 -23
- TopCoder SRM 144 DIV 2
- Topcoder SRM 661 (Div.1) 250 MissingLCM - 数论
- topcoder srm 450 div1
- Topcoder SRM 683 Div2 - C
- Topcoder SRM 635 div2 1000
- topcoder srm 712 div1 -23
- Topcoder SRM 636 Div2 1000(切蛋糕,最后一块给自己。最小值中求最大值,二分+枚举)
- topcoder srm 693 div1 -3