标签:
SGU 100 A+B :太神不会
SGU 101 Domino:
题目大意:有N张骨牌,两张骨牌有两面有0到6的数字,能相连当且仅当前后数字相同,问能否有将N张骨牌连接的方案?思路:裸的欧拉回路,注意自环,连通
1 //sgu101 2 #include<iostream> 3 #include<cstdio> 4 #include <math.h> 5 #include<algorithm> 6 #include<string.h> 7 #include<queue> 8 #define MOD 1000003 9 #define maxn 2009 10 using namespace std; 11 int head[maxn],ans[maxn],top,now=1,next[maxn],point[maxn]; 12 int degree[maxn],sum=0; 13 bool visit[maxn],ss[maxn],sign[maxn]; 14 void add(int x,int y,bool si){ 15 next[++now]=head[x];head[x]=now; 16 point[now]=y;ss[now]=si; 17 } 18 void dfs(int s){ 19 for(int i=head[s];i;i=next[i])if(!visit[i>>1]){ 20 sum++; 21 int u=point[i];visit[i>>1]=1;dfs(u); 22 ans[++top]=i>>1;sign[top]=ss[i]; 23 } 24 } 25 int main() 26 { 27 int n,x,y,cnt=0,s=0; 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++){ 30 scanf("%d%d",&x,&y);add(x,y,1);add(y,x,0); 31 degree[x]++;degree[y]++;s=x; 32 } 33 for(int i=0;i<=6;i++)if(degree[i]&1)cnt++,s=i;dfs(s); 34 if(sum!=n ||cnt>2){printf("No solution\n");return 0;} 35 for(int i=top;i>=1;i--){ 36 printf("%d ",ans[i]); 37 if(sign[i]==1)printf("+\n");else printf("-\n"); 38 } 39 return 0; 40 }
SGU 102 Coprimes:
题目大意:求小于n与n互质的数的个数 思路:欧拉函数哪家强
1 //sgu101 2 #include<iostream> 3 #include<cstdio> 4 #include <math.h> 5 #include<algorithm> 6 #include<string.h> 7 #include<queue> 8 #define MOD 1000003 9 #define maxn 2009 10 using namespace std; 11 int phi(int n) 12 { 13 int ret=n; 14 for(int i=2;i*i<=n;i++) 15 { 16 if(n%i==0)ret=(ret/i)*(i-1); 17 while(n%i==0)n/=i; 18 } 19 if(n>1)ret=ret/n*(n-1); 20 return ret; 21 } 22 int main() 23 { 24 int n; 25 scanf("%d",&n); 26 printf("%d\n",phi(n)); 27 return 0; 28 }
标签:
原文地址:http://www.cnblogs.com/philippica/p/4275871.html