3.4
1.敲代码
来源:头歌test5.3
一天devtang被安排了一个很重要的任务,就是必须要一天之内写完n行代码。所以他不得不熬夜写代码。不过他实在太困了,于是他决定按下面的方式写代码:开始的时候,他先写v行代码,然后喝一杯茶,接着他再写 v/k行,然后再喝一杯茶,接着他再写v/(k2)行,然后再喝一杯茶,如此的进行下去,直到出现一个整数p使得v/(kp)为0。这时候devtang已经困的不行了,他就会一觉睡到第二天,不过任务还是必须要完成的。(注意是整除)
现在他需要你帮他求出最小的v,且必须要完成任务
输入
输入有多组数据,每组只有2个数据n和k,分别表示总共需要完成的代码量和上面所述的k。(1<=n<=10^9,2<=k<=10)
0 0 表示输入结束。
输出
每组输出只有一个数字,就是v。
输入输出样例
输入样例 1
7 2
59 9
0 0
输出样例 1
4
//等比数列求和
#include<iostream>
using namespace std;
int main()
{
while(1)
{
int n,k,v;
cin>>n>>k;
if(n==0&&k==0) break;
if(n<k||k==1) cout<<n<<endl;//特殊情况
else{
//根据n最大能除到k的几次方,算出一个最大的p
//再根据这个p算出一个估计的v的值
int p=0;
int d=k;
while((n/d)!=0)
{
p++;
d=d*k;
}
v=(n*(k-1)*d/k)/(d-1);
//真正的v就在v的附近且比v大
for(int i=v;1;i++)
{
int sum=i;
int a=k;
int b=i;
for(int j=1;j<=p;j++)
{
sum+=b/a;
a=a*k;
}
if(sum>=n) {
cout<<i<<endl;
break;
}
}
}
}
return 0;
}
2.走到哪儿了
来源:头歌test5.4
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
int m;cin>>m;
while(m--)
{
int res=0;
int n;cin>>n;
vector<int> step;//记录学姐走的每一步
getchar();//注意,要吞掉输入n之后的回车
for(int i=1;i<=n;i++)
{
string s;
getline(cin,s);//因为有空格,所以要用getline
int num=s.size();
if(s=="LEFT") {
res-=1;
int a=-1;
step.push_back(a);
}
else if(s=="RIGHT")
{
res+=1;
int a=1;
step.push_back(a);
}
else
{
int a=s[num-1]-'0';
int b=step[a-1];//注意这里要-1,因为step是从0开始的
res+=b;
step.push_back(b);
}
}
cout<<res<<endl;
}
return 0;
}
3.返回序号:进制转换
来源:头歌 test6.1
//本质是26进制
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
typedef long long int ll;
int main()
{
string s;
cin>>s;
int n=s.size();
ll sum=0;
for(int i=0;i<n;i++)
{
sum=sum*26+(s[i]-'A'+1);
}
cout<<sum;
return 0;
}
4.快速幂
来源:头歌test 6.3
//快速幂算法
//利用二进制加速运算
//取余:
//(a + b) % p = (a % p + b % p) % p
//(a - b) % p = (a % p - b % p ) % p
//(a * b) % p = (a % p * b % p) % p
#include<iostream>
#include<string>
using namespace std;
typedef long long int ll;
int main()
{
int q;cin>>q;
while(q--)
{
int a,b,p;
cin>>a>>b>>p;
ll res=1;
while(b)
{
if(b&1) res=(res*a)%p;//如果b化为2进制的最后一位为1
a=a*a%p;
b=b>>1;//b右移一位
}
cout<<res%p<<endl;
}
}
5.线性分类器
来源:每日一题
https://www.acwing.com/file_system/file/content/whole/index/content/4186216/
//对A类,B类每一个点,带入直线判断
//分别存储>0,<0的个数
#include<iostream>
#include<string>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
int main()
{
ll n,m;
cin>>n>>m;
ll x,y;
char c;
ll k1,k2,k0;
vector<PII> a,b;
for(int i=0;i<n;i++)//输入点,并分为A,B两类
{
cin>>x>>y>>c;
if(c=='A') a.push_back({x,y});
else b.push_back({x,y});
}
ll na=a.size();
ll nb=b.size();
for(int i=0;i<m;i++)//输入分界线
{
cin>>k0>>k1>>k2;
ll cnta0=0,cnta1=0;//计数:类别为a,且<0(或>0)
ll cntb0=0,cntb1=0;
for(int j=0;j<n;j++)
{
ll sum=0;
sum=k0+a[j].first*k1+a[j].second*k2;
if(sum) cnta1++;
else cnta0++;
}
for(int j=0;j<n;j++)
{
ll sum=0;
sum=k0+b[j].first*k1+b[j].second*k2;
if(sum) cntb1++;
else cntb0++;
}
if((cnta1==na&&cntb0==nb)||(cnta0==na&&cntb1==nb)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}