101
#include <cstdio>
#include <cstring>
const int MAXD = 10;
const int MAXM = 210;
int N, e;
int h[MAXD], p[MAXD], dgr[MAXD];
int next[MAXM], v[MAXM], vis[MAXM];
int find(int x) {
return p[x] == x ? x : (p[x] = find(p[x]));
}
void add(int a, int b) {
v[e] = b;
next[e] = h[a];
h[a] = e++;
}
void init() {
int a, b, x, y;
e = 0;
memset(h, -1, sizeof(h));;
memset(dgr, 0, sizeof(dgr));
for (int i = 0; i < 7; i++)
p[i] = i;
for (int i = 0; i < N; i++) {
scanf("%d%d", &a, &b);
dgr[a]++, dgr[b]++;;
x = find(a), y = find(b);
if (x != y) p[y] = x;
add(a, b);
add(b, a);
}
}
void printpath(int u) {
int i;
for (i = h[u]; i != -1; i = next[i])
if (!vis[i]) {
vis[i] = vis[i^1] = 1;
printpath(v[i]);
printf("%d %c\n", i/2+1, i%2 ? '+':'-');
}
}
void solve() {
int i, num, ok, start;
num = 0;
for (i = 0; !dgr[i]; i++);
start = i;
ok = 1;
for (int j = i; j < 7; j++) {
if (dgr[j]&&find(start) != find(j)){
ok = 0; break;
}
if (dgr[j]%2) num++,start = j;
}
if (num>2) ok = 0;
if (!ok) {
printf("No solution\n");
return;
}
memset(vis, 0, sizeof(vis));
printpath(start);
}
int main() {
while (scanf("%d", &N) != EOF) {
init();
solve();
}
return 0;
}
102
枚举解法
#include <cstdio>
int gcd(int a, int b) {
if (!b) return a;
return gcd(b,a%b);
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int sum = 1;
for (int i = 2; i <= n; i++)
if (gcd(i,n)==1) sum++;
printf("%d\n",sum);
}
return 0;
}
欧拉函数解法
#include <cstdio>
#include <cmath>
int euler(int x) {
int i, res = x;
for (i = 2; i < (int)sqrt(x*1.0)+1; i++)
if (x%i==0) {
res = res/i*(i-1);
while(x%i==0) x /= i;
}
if (x > 1) res = res/x*(x-1);
return res;
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
printf("%d\n", euler(n));
}
return 0;
}
103欧拉路径
/*
PROBLEM:sgu103
AUTHER:Rinyo
MEMO:最短路
*/
#include<cstdio>
#include<cstring>
int n,m,st,ed,INF;
int r[310],c[310],ans[310],dist[310],last[310];
int t[310][2];
int map[310][310];
bool v[310];
int q[30010];
inline int cmin(const int &x,const int &y) {return x<y?x:y;}
void init()
{
scanf("%d%d%d%d",&st,&ed,&n,&m);
for (int i=1;i<=n;i++)
{
char ch[5];
scanf("%s%d%d%d",ch,&r[i],&t[i][0],&t[i][1]);
if (ch[0]=='B') c[i]=0;else c[i]=1;
}
for (int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
map[x][y]=z;map[y][x]=z;
}
}
void color(int a,int time,int& ca,int& ta)
{
if (time<r[a]) {ta=r[a];ca=c[a];return;}
else
{
int temp=(time-r[a])%(t[a][0]+t[a][1]);
int now=time-temp;
if (c[a]==1)
{
if (temp<t[a][0]) {ca=0;ta=now+t[a][0];return;}
else {ca=1;ta=now+t[a][0]+t[a][1];return;}
}
else
{
if (temp<t[a][1]) {ca=1;ta=now+t[a][1];return;}
else {ca=0;ta=now+t[a][0]+t[a][1];return;}
}
}
}
int calctime(int a,int b,int time,int f)
{
int ca,cb,ta,tb;
color(a,time,ca,ta);color(b,time,cb,tb);
if (ca==cb) return time;
if (ta==tb)
{
if (f==0) {return calctime(a,b,ta,1);}
else if (time<=r[a]||time<=r[b]) return calctime(a,b,ta,1);
else return INF;
}
return cmin(ta,tb);
}
void spfa()
{
memset(v,false,sizeof(v));
for (int i=1;i<=n;i++) dist[i]=INF;
int head=0,tail=1;
v[st]=true;q[1]=st;dist[st]=0;last[st]=0;
while (head<tail)
{
head++;
int now=q[head];
for (int i=1;i<=n;i++)
{
if (map[now][i]>0)
{
int temp=calctime(now,i,dist[now],0);
if (temp>=INF) continue;
if (temp+map[now][i]<dist[i])
{
dist[i]=temp+map[now][i];
last[i]=now;
if (!v[i]) {tail++;q[tail]=i;v[i]=true;}
}
}
}
v[q[head]]=false;
}
if (dist[ed]>=INF) {printf("0");return;}
printf("%d\n",dist[ed]);
int now=ed,len=0;
while (now!=0) {len++;ans[len]=now;now=last[now];}
for (int i=len;i>=2;i--) printf("%d ",ans[i]);
printf("%d\n",ans[1]);
return;
}
int main()
{
freopen("sgu103.in","r",stdin);
freopen("sgu103.out","w",stdout);
INF=99999999;
init();
spfa();
return 0;
}
104 dp
#include<stdio.h>
#include<string.h>
int main()
{
int f,v,i,j,k,D[101][101],a[101][101];
bool t[101][101];
scanf("%d%d",&f,&v);
memset(D,0,sizeof(D));
memset(t,false,sizeof(t));
for(i=1;i<=f;++i)
{
for(j=1;j<=v;++j)
scanf("%d",&a[i][j]);
D[i][i]=D[i-1][i-1]+a[i][i];
t[i][i]=true;
}
for(i=1;i<=f;++i)
{
for(j=i+1;j<=v;++j)
{
D[i][j]=D[i][j-1];
if(D[i-1][j-1]+a[i][j]>D[i][j])
{
D[i][j]=D[i-1][j-1]+a[i][j];
t[i][j]=true;
}
}
}
printf("%dn",D[f][v]);
for(i=f,k=0,j=v;i>0;--i)
{
while(t[i][j]==false) j--;
a[0][k++]=j--;
}
while(k--) printf("%d ",a[0][k]);
putchar('n');
return 0;
}
105 暴力 TLE
找规律 AC
#include <cstdio>
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int ans = n/3*2;
if (n%3==2) ans++;
printf("%d\n", ans);
}
return 0;
}
117 PE
#include <cstdio>
int main() {
int n, m, k, tep;
while (scanf("%d%d%d", &n, &m, &k) != EOF) {
int mm = m;
int cnt = 0;
while (n--) {
scanf("%d", &tep);
int ans = 1;
while (m) {
if (m&1) ans = ans*tep%k;
tep = tep*tep%k;
m >>= 1;
}
if (!ans%k) cnt++;
m = mm;
}
printf("%d\n", cnt);
}
}