3 13 123
1 6 57
无
Hungar
//此题不难,但需要费点时间推算
#include
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
#include
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
__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
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
#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
#include
#include
#include
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
#include
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;jm) 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
#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
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
#include
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
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;
}