您的位置:首页 > 运维架构

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,暴力枚举即可。

#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;
}

};


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: