标签:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 //LL prey[100010]; 5 bool vis[100010]; 6 LL read() 7 { 8 LL s=0,fh=1;char ch=getchar(); 9 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fh=-1;ch=getchar();} 10 while(ch>=‘0‘&&ch<=‘9‘){s=s*10+(ch-‘0‘);ch=getchar();} 11 return s*fh; 12 } 13 int main() 14 { 15 LL n,x,a,b,m,k,i,j,lp; 16 n=read(); 17 x=read();a=read();b=read();m=read(); 18 k=n*x+((n-1)*n)/2*a;//假设全部增加a的总钱数. 19 k-=m;//用 全部增加a的总钱数 减去 实际花费的钱数 得到有多少钱从 +a 转化为 -b ,也就是减去(a+b). 20 k/=(a+b);//计算出有多少书进行了从 +a 转化为 -b. 21 //因为改变每一个差量,所影响的数的个数为(0,1,2...n-1)中的一个.所以,我们只需要求出k可以由 0~(n-1) 中的哪一些组成. 22 memset(vis,false,sizeof(vis)); 23 for(i=n-1;i>=0;i--)//倒着去找,一定保证k可以组成.(有点类似倍增LCA的倒着找的原理) 24 { 25 if(k>=i) 26 { 27 k-=i; 28 vis[i]=true;//标记为true的代表要转换为-b. 29 if(k==0)break; 30 } 31 } 32 /*双重循环(60分) 33 for(i=1;i<=n;i++){prey[i]=x;x+=a;} 34 for(i=1;i<=n-1;i++) 35 { 36 if(vis[i]==true) 37 { 38 for(j=n;j>=n-i+1;j--)prey[j]-=(a+b); 39 } 40 } 41 for(i=1;i<=n;i++)printf("%lld ",prey[i]);*/ 42 printf("%lld",x); 43 for(i=n-1;i>=1;i--) 44 { 45 if(vis[i]==true)//若要转化为-b,就要在原先的x的基础上加上-b(即减去b). 46 { 47 x-=b; 48 } 49 else 50 { 51 x+=a; 52 } 53 printf(" %lld",x); 54 } 55 fclose(stdin); 56 fclose(stdout); 57 return 0; 58 }
标签:
原文地址:http://www.cnblogs.com/Var123/p/5374553.html