3 13 123
1 6 57
无
Hungar
//此题不难,但需要费点时间推算
#include<stdio.h> long long fun(long long n) { long long count = 0; long long i = 1; long long current = 0,after = 0,before = 0; while((n / i) != 0) { current = (n / i) % 10; before = n / (i * 10); after = n - (n / i) * i; if (current > 1) count = count + (before + 1) * i; else if (current == 0) count = count + before * i; else if(current == 1) count = count + before * i + after + 1; i = i * 10; } return count; } int main () { long long n; while(scanf("%lld", &n) != EOF) { long long ans = fun(n); printf("%lld\n", ans); } return 0; }
问把所有格子都走一遍有多少种方法!
如图: 该点可以向如图5个方向移动
1 2 3 998
2 24 96 510782696
无
致我失去的数码相机 = =!!
#include<cstdio> #include<cstring> int cnt,n; int vis[3][1100]; int num[8][2]={1,0, 0,1, -1,0, 0,-1, 1,1, 1,-1, -1,1, -1,-1}; void DFS(int x,int y,int flag) { int k,tmp_x,tmp_y; if(flag==2*n) { cnt++; return ; } for(k=0;k<8;k++) { tmp_x=num[k][0]+x; tmp_y=num[k][1]+y; if((tmp_x==1 || tmp_x==2) && tmp_y>0 && tmp_y<=n && !vis[tmp_x][tmp_y]) { vis[tmp_x][tmp_y]=1; DFS(tmp_x,tmp_y,flag+1); vis[tmp_x][tmp_y]=0; } } } int main() { int i,j; while(scanf("%d",&n)==1) { memset(vis,0,sizeof(vis)); cnt=0; for(i=1;i<=2;i++) for(j=1;j<=n;j++) { vis[i][j]=1; DFS(i,j,1); vis[i][j]=0; } printf("%d\n",cnt); } return 0; }
#include<cstdio> __int64 d[1100]; __int64 num1[1100],num2[1100]; int main() { int i; d[1]=2; d[2]=24; d[3]=96; num1[2]=4; num2[2]=6; num1[3]=8; num2[3]=12; for(i=4;i<=1000;i++) { num1[i]=num1[i-1]*2%1000000007; num2[i]=(num2[i-1]+num2[i-2]+2*i)%1000000007; d[i]=num1[i]*num2[i]%1000000007; } while(scanf("%d",&i)==1) { printf("%d\n",d[i]); } return 0; }
4 4 1 2 3 4 5 6 7 8 5 5 5 12 14 15 16 1 2 7 8 9
1 2
无
Mr.Cai
#include<stdio.h> int abss(int x) { if(x > 0) return x; else return -x; } int A[1111],B[1111]; int main () { int a, b; int i, j; while(scanf("%d %d", &a, &b) != EOF) { for(i = 0; i < a; i++) scanf("%d", &A[i]); for(i = 0; i < b; i++) scanf("%d", &B[i]); int min = 0x7fffffff; int it_a,it_b; int temp; for(it_a = 0; it_a < a; it_a++) { temp = abss(A[it_a] - B[0]); for(it_b = 1; it_b < b; it_b++) { if(temp < abss(A[it_a] - B[it_b])) break; temp = abss(A[it_a] - B[it_b]); } min = min < temp ? min : temp; } printf("%d\n",min); } return 0; }
1 3 3 123 456 722 111 111 111 222 222 222 333 333 333
123 345 622
无
Mr.Cai
#include<stdio.h> #define N 205 int A[4][N][N]; int ans[N][N]; int funn(int x) { if(x > 9) return 9; else return x; } void fun(int x, int y) { switch (A[0][x][y]) { case 1:ans[x][y] = A[1][x][y];break; case 2:ans[x][y] = A[2][x][y];break; case 3:ans[x][y] = funn(A[1][x][y]+A[2][x][y]) ;break; case 4:ans[x][y] = A[3][x][y];break; case 5:ans[x][y] = funn(A[1][x][y]+A[3][x][y]);break; case 6:ans[x][y] = funn(A[2][x][y]+A[3][x][y]);break; case 7:ans[x][y] = funn(A[1][x][y]+A[2][x][y]+A[3][x][y]);break; default:ans[x][y] = 0;break; } } int main () { int T; scanf("%d", &T); while(T--) { int n, m; int i, j, k; scanf("%d %d", &m, &n);//m为列数 n为行数 for(k = 0; k < 4; k++) for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) scanf("%1d", &A[k][i][j]); for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) fun(i,j); for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) printf("%d",ans[i][j]); printf("\n"); } } return 0; }
2 5 4 1,2,3,4,5 5 6 1,2,3,4,5
2 3
For the first case: 1+3=4, 4=4. For the second case: Don't consider the order, that means 1+2+3=6 equals 1+3+2=6 equals 3+1+2=6, etc.
Mr.Cai
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; int vis[100]; int num[100]; int n, k; int ans; void dfs(int pos,int sum) { if(sum > k) return ; if(sum == k) {ans++; return;} for(int i = pos; i < n; i++) { if(!vis[i]) vis[i] = 1; dfs(i+1,sum+num[i]); vis[i] = 0; } } int main () { int T; int i, j; scanf("%d", &T); while(T--) { scanf("%d %d",&n, &k); for(i = 0; i < n; i++) { scanf("%d", &num[i]); getchar(); } sort(num,num+n); memset(vis, 0, sizeof(vis)); ans = 0; dfs(0,0); printf("%d\n",ans); } return 0; }
Elaine是学园都市中的一个风纪委,每天都会接到命令对某个街道进行检查,并抓捕危险分子。她所在的风纪委支部附近有M条街道。这些街道由北到南并排均匀的分布在一条直线上,每条街道之间的距离都为1。但是众所周知,Elaine是一个很懒很懒的人(-..-说我坏话!!被我看到了!!),她不想一步一步走完所有街道,但好在她的好友Kuso为她制作了大量的传送卷轴。不过,因为Kuso的能力等级太低,他制作的卷轴有严重的缺点,他的卷则只能向南飞一段固定的距离(当然,他预先制作了很多种类的卷轴),而Elaine所在的风纪委支部却在最北边。每一次出去检查,Elain都要使用好几张卷轴。但如果是某些不能传送到的地方,Elaine只能走过去了。不过回来的话,她就可以用自带的传送系统传送到支部的传送点。
有一天,Elaine想知道,如果她从风纪委支部出发,可以检查那些街道。她手里有N种传送卷轴(1,2,3,,,N),每个卷轴可以传送的距离为Ai,卷轴的数量为Ci。则Elaine靠那些卷轴,可以不走路而直接传送的有哪些街道?
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
8 4
风纪委支部到第一条街道的距离也为1。
本站或者转载
#include<stdio.h> #include<string.h> int dp[2][1010],A[110],C[110]; int main(){ int n,m,i,j,k,g,ans,flag,sp; while(scanf("%d%d",&n,&m),n+m){ memset(dp,0,sizeof(dp));dp[0][0]=1; for(i=1;i<=n;i++) scanf("%d",&A[i]); for(i=1;i<=n;i++) scanf("%d",&C[i]); flag=0; for(i=1;i<=n;i++){ if(A[i]>m) continue; flag=1-flag; for(k=sp=0;k<=m;k++){ dp[flag][k]=dp[1-flag][k]; sp+=dp[1-flag][k]; } if(sp==m+1) break; for(j=0;j<A[i];j++){ if(j+A[i]>m) break; sp=dp[1-flag][j]?0:-10000;g=1; for(k=j+A[i];k<=m;k+=A[i],g++){ if(g-sp<=C[i]) dp[flag][k]=1; if(dp[1-flag][k]) sp=g; } } } ans=0; for(i=1;i<=m;i++) ans+=dp[flag][i]; printf("%d\n",ans); } return 0; }
0 1 9 1000000000
0 1 34 2123828
无
本站或者转载
//矩阵求解 #include<stdio.h> #define N 20130719 struct matrix { long long s[3][3]; }; matrix A,B,D; matrix mul(matrix D, matrix A) { int i, j, k; matrix s; for(i = 0; i < 2; i++) for(j = 0; j < 2; j++) { s.s[i][j] = 0; for(k = 0; k < 2; k++) s.s[i][j] = (s.s[i][j] + D.s[i][k] * A.s[k][j]) % N; } return s; } matrix pow(matrix A, long long k) { matrix s , D = A ; s.s[0][0] = 1; s.s[0][1] = 0; s.s[1][0] = 0; s.s[1][1] = 1; while(k) { if(k & 1) s = mul(D, s); D = mul(D, D); k = k/2; } return s; } int main (void) { long long n; while(scanf("%lld", &n) != EOF) { if(n == 0) {printf("0\n");continue;} if(n == 1) {printf("1\n");continue;} A.s[0][0] = 1; A.s[0][1] = 1; A.s[1][0] = 1; A.s[1][1] = 0; B = pow(A,n); printf("%d\n",B.s[0][1]%N); } return 0; }
//打表找出循环周期 #include<stdio.h> int f[1000000]; int main() { int a,b,c,i,j; f[0]=0; f[1]=1; for(i=2;i<=572889;i++) f[i]=(f[i-1]+f[i-2])%20130719; while(scanf("%d",&a)!=EOF) { printf("%d\n",f[a%572880]); } return 0; }
大白菜带着套套去超市买好吃的,到了付钱的时候,收银员告诉大白菜需要付N元。
大白菜突然想知道自己付钱有多少种方法,求助我们聪明的ACMER来告诉他,有几种付钱的方法。
(已知,我天朝有,红色老人头,绿色老人头,黄色老人头 (100,50,20,10,5,1 )等等,ps:当大白菜带着套套的时候,他将化身无敌大款,各种老人头要多少有多少);1 5 10
1 2 4
无
本站或者转载
#include<stdio.h> #include<string.h> int dp[2005]; int a[6]={1,5,10,20,50,100}; int main() { int i,j,k,n; memset(dp,0,sizeof(dp)); dp[0]=1; for(i=0;i<6;i++) { for(j=a[i];j<=2000;j++) dp[j]+=dp[j-a[i]]; } dp[0]=0; while(scanf("%d",&n)!=EOF) { printf("%d\n",dp[n]); } return 0; }
#include<stdio.h> int n; long long ans; int pan (int x) { if(x == n) return 1; else if(x > n) return 0; else return -1; } int main () { //freopen("data.txt","r",stdin); //freopen("data.txt","w",stdout); //for(n = 1; n <= 1000; n++) while(scanf("%d", &n) != EOF) { ans = 0; int sum ; int a, b, c, d, e, f; for(a = n / 100; a >= 0; a--) { sum = a * 100; if(pan(sum) == 1) {ans++;sum -= a * 100;continue;} else if(pan(sum) == 0) {sum = sum - a*100;continue;} for(b = (n - sum) / 50; b >= 0 ; b--) { sum += b * 50; if(pan(sum) == 1) {ans++;sum -= b * 50;continue;} else if(pan(sum) == 0) {sum -= b*50;continue;} for(c = (n - sum) / 20; c >= 0; c--) { sum += c * 20; if(pan(sum) == 1) {ans++;sum -= c * 20;continue;} else if(pan(sum) == 0) {sum -= c*20;continue;} for(d = (n - sum)/10; d >= 0; d--) { sum += d * 10; if(pan(sum) == 1) {ans++;sum -= d * 10;continue;} else if(pan(sum) == 0) {sum -= d*10;continue;} for(e = (n - sum)/5; e >= 0; e--) { sum += e * 5; if(pan(sum) == 1) {ans++;sum -= e * 5;continue;} else if(pan(sum) == 0) {sum -= e * 5;continue;} ans++; if(e != 0) sum -= e * 5; else if(d != 0) sum -= d * 10; else if(c != 0) sum -= c * 20; else if(b != 0) sum -= b * 50; else if(a != 0) sum -= a * 100; } } } } } printf("%lld\n", ans); } return 0; }