2017年8月12日(模拟四(smoj2193,2194,2195)强连通分量、勾股定理探索、动态规划+容斥原理)

来源:互联网 发布:工资数据分析 编辑:程序博客网 时间:2024/06/04 17:45
#include <stdio.h>#include <stack>#include <cstring>#include <stdlib.h>#define maxN 100010using namespace std;stack <int> sta;struct Tnode{int nxt,v;}edge[maxN];int first[maxN];int dfn[maxN],low[maxN],vis[maxN],instack[maxN],f[maxN],chu[maxN],ru[maxN];int tot,k,cnt;int n,m;int ans;void init(){memset(first,-1,sizeof first);memset(dfn,-1,sizeof dfn);memset(f,0,sizeof f);ans=tot=k=cnt=0;} void add(int u,int v){edge[++tot].v=v,edge[tot].nxt=first[u];first[u]=tot;}void tarjan(int v){dfn[v]=low[v]=++k;instack[v]=1;sta.push(v);for (int i=first[v]; i!=-1; i=edge[i].nxt){//printf("i:%d\n",i);int u=edge[i].v;if (!instack[u]){tarjan(u);low[v]=min(low[v],low[u]);}elselow[v]=min(low[v],dfn[u]);}if (dfn[v]==low[v]){cnt++;while (!sta.empty()){int u=sta.top();sta.pop(); vis[u]=cnt;instack[u]=0;if (u==v) break;} }}int main(){freopen("2193.in","r",stdin);freopen("2193.out","w",stdout);scanf("%d%d",&n,&m);init();for (int i=1; i<=m; i++){int x,y;scanf("%d%d",&x,&y);add(x,y);chu[x]++; ru[y]++;}for (int i=1; i<=n; i++) if (dfn[i]==-1) tarjan(i);for (int u=1; u<=n; u++){bool flag=0;if (chu[u]==0 && ru[u]==0) ans=-1;for (int i=first[u]; i!=-1; i=edge[i].nxt){int v=edge[i].v;if (ru[v]<=1) flag=1;if (vis[u]!=vis[v]) f[vis[v]]=1;}if (ru[u]==0 && !flag) ans=-1;}for (int i=1; i<=cnt; i++) if (!f[i]) ans++;printf("%0.6lf",(double)(n-ans)/(double)n);return 0;}#include <stdio.h>#include <cmath>using namespace std;#define ll long longll ans=0,r;long long gcd(ll a,ll b){ return a%b==0?b:gcd(b,a%b);}bool check(ll a,double b){if (floor(b)==b){ll x=(long long)floor(b);if (gcd(a*a,x*x)==1 && a*a!=x*x) return true;}return false;}int main(){freopen("2194.in","r",stdin);freopen("2194.out","w",stdout);scanf("%lld",&r);for (ll i=1; i<=(ll)sqrt(2*r); i++)if ((2*r)%i==0){for (ll j=1; j<=(ll)sqrt(2*r/(i*2)); j++){double k=sqrt(((2*r)/i)-(j*j));if (check(j,k)) ans++;}if (i!=(2*r)/i)for (ll j=1; j<=(ll)sqrt(i/2); j++){double k=sqrt(i-j*j);if (check(j,k)) ans++;} }printf("%lld\n",ans*4+4);return 0;}#include <stdio.h>#include <algorithm>#include <cstring>using namespace std;#define maxN 2200#define MOD 1000000009#define F(i,j,n) for (int i=j; i<=n; i++)#define D(i,j,n) for (int i=j; i>=n; i--)#define ll long longint a[maxN],b[maxN],nxt[maxN];ll f[maxN][maxN],d[maxN];ll c[maxN][maxN],Jc[maxN];int n,k;void init(int n){Jc[0]=1;F(i,1,n) Jc[i]=Jc[i-1]*i%MOD;memset(c,0,sizeof c);F(i,0,n) c[i][0]=1;F(i,1,n) F(j,1,i) c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;}int main(){freopen("2195.in","r",stdin);freopen("2195.out","w",stdout);scanf("%d%d",&n,&k);F(i,1,n) scanf("%d",&a[i]);F(i,1,n) scanf("%d",&b[i]);sort(a+1,a+n+1);sort(b+1,b+n+1);int j=1; F(i,1,n) {for (; a[i]>b[j] && j<=n; j++);nxt[i]=j-1;}memset(f,0,sizeof f);F(i,0,n) f[i][0]=1;F(i,1,n) F(j,1,i) f[i][j]=(f[i-1][j]+(f[i-1][j-1]*max(nxt[i]-j+1,0))%MOD)%MOD;init(n);D(i,n,(n+k)/2){d[i]=(f[n][i]*Jc[n-i])%MOD;F(j,i+1,n) d[i]=(d[i]-(d[j]*c[j][i])%MOD+MOD)%MOD;}printf("%lld\n",d[(n+k)/2]);return 0;} 


阅读全文
0 0
原创粉丝点击