CF 61 div2 D. Petya and His Friends

题目:D - Petya and His Friends

思路:高精度模板可以过,但是找规律也行


高精度的:


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <sstream>
#include <map>
using namespace std;
#define maxn 240
bool vis[maxn];
map<string,int>m;
stringstream ss;
string sss;
void Prime()
{
    m.clear();
    memset(vis,true,sizeof(vis));
    vis[0]=vis[1]=false;
    for(int i=2;i<maxn;i++)
    {
        if(vis[i])
        {
            ss.clear();
            ss<<i;
            ss>>sss;
            m[sss]++;
            for(int j=2*i;j<maxn;j+=i)
                vis[j]=0;
        }
    }
}
struct BigInt
{
    string a;
    int sign;

    BigInt() {} // default constructor

    BigInt(string b){ // constructor for string
        (*this)=b;
    }

    int size(){
        return a.size();
    }

    BigInt inverseSign(){
        sign*=-1;
        return (*this);
    }

    BigInt normalize(int newSign){ // remove leading zero and fix sign
        for(int i=a.size()-1;i>0&&a[i]=='0';i--)
            a.erase(a.begin()+i);
        sign=(a.size()==1 &&a[0]=='0'  )?1:newSign;
        return (*this);
    }

    void operator = (string b){
        a=b[0]=='-'?b.substr(1):b;
        reverse(a.begin(),a.end());
        this->normalize(b[0]=='-'?-1:1);
    }

    bool operator < (const BigInt &b) const{
        if(sign!=b.sign)    return sign<b.sign;
        if(a.size()!=b.a.size())
            return sign==1?a.size()<b.a.size():a.size()>b.a.size();
        for(int i=a.size()-1;i>=0;i--)
            if(a[i]!=b.a[i])
                return sign==1?a[i]<b.a[i]:a[i]>b.a[i];
        return false;
    }

    bool operator == (const BigInt &b) const{
        return a==b.a && sign==b.sign ;
    }

    BigInt operator + (BigInt b){
        if(sign!=b.sign)
            return (*this)- b.inverseSign();
        BigInt c;
        for(int i=0,carry=0;i<a.size()||i<b.size()||carry;i++){
            carry+=(i<a.size()?a[i]-48:0)+(i<b.size()?b.a[i]-48:0);
            c.a+=(carry%10+48);
            carry/=10;
        }
        return c.normalize(sign);
    }

    BigInt operator - (BigInt b){
        if(sign!=b.sign)
            return (*this) + b.inverseSign();
        int s=sign;
        sign=b.sign=1;
        if((*this)<b)
            return ((b-(*this)).inverseSign()).normalize(-s);
        BigInt c;
        for(int i=0,borrow=0;i<a.size();i++){
            borrow=a[i]-borrow-(i<b.size()?b.a[i]:48);
            c.a+=borrow>=0?borrow+48:borrow+58;
            borrow=borrow>=0?0:1;
        }
        return c.normalize(s);
    }

    BigInt operator * (BigInt b){
        BigInt c("0");
        for(int i=0,k=a[i]-48;i<a.size();i++,k=a[i]-48){
            while(k--) c=c+b;
            b.a.insert(b.a.begin(),'0');
        }
        return c.normalize(sign*b.sign);
    }

    BigInt operator / (BigInt b){
        if(b.size()==1 && b.a[0]=='0')
            b.a[0]/=(b.a[0]-48);
        BigInt c("0"),d;
        for(int j=0;j<a.size();j++)
            d.a+="0";
        int dsign=sign*b.sign;
        b.sign=1;
        for(int i=a.size()-1;i>=0;i--){
            c.a.insert(c.a.begin(),'0');
            c=c+a.substr(i,1);
            while(!(c<b))
                c=c-b,d.a[i]++;
        }
        return d.normalize(dsign);
    }

    BigInt operator % (BigInt b){
        if(b.size()==1 && b.a[0]=='0')
            b.a[0]/=(b.a[0]-48);
        BigInt c("0");
        b.sign=1;
        for(int i=a.size()-1;i>=0;i--){
            c.a.insert(c.a.begin(),'0');
            c=c+a.substr(i,1);
            while(!(c<b))
                c=c-b;
        }
        return c.normalize(sign);
    }

    void Print(){
        if(sign==-1) putchar('-');
        for(int i=a.size()-1;i>=0;i--)
            putchar(a[i]);
        cout<<endl;
    }
};
int main()
{
    Prime();
    int n;
    cin>>n;
    if(n==1||n==2)
    {
        cout<<-1<<endl;
        return 0;
    }
    sss="1";
    BigInt cnt,ans=sss;
    map<string,int>::iterator it=m.begin();
    for(int i=1;i<=n;i++)
    {
        cnt=it->first;
        ans=ans*cnt;
        it++;
    }
    it=m.begin();
    for(int i=1;i<=n;i++)
    {
        cnt=it->first;
        cnt=ans/cnt;
        it++;
        cnt.Print();
    }
    return 0;
}


找规律的话,假设a,b,c是素数,第一个数是a*b,第二个数是b*c,后面的数是 a*c*i  (1<=i<=n-2)


#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define MAXN 100000
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n<=2)
        cout<<-1<<endl;
    else
    {
        cout<<35<<endl;
        cout<<77<<endl;
        for(int i=1;i<=n-2;i++)
            cout<<55*i<<endl;
    }
    return 0;
}








解法:贪心算法 如果两个字符串不相等,那么它们必定至少有一位不一样。考虑对于这一位,我们应该对字符串 a 进行哪种操作,才能使得它更接近于字符串 b。 首先,我们可以通过交换字符串 a 中的两个数字,使得这一位变为我们想要的数字。如果我们把这一位变成了 b 中的数字,那么显然这一位就不需要再进行修改了。因此,我们只需要考虑把这一位变成 a 中的数字 4 或 7。 如果我们把这一位变成 a 中的数字,则需要执行一次操作;如果我们把这一位变成 a 中的数字,则需要执行一次操作。那么,我们应该采取哪种操作呢? 我们可以贪心地想,如果我们把这一位变成 a 中的数字,那么这一位和 b 中的数字就越相似,那么接下来的操作就越容易执行。因此,我们应该选择将这一位变成 a 中的数字,从而尽可能地增加和 b 相同的数字的数量。 实现时,我们可以从左到右扫描字符串 a 和 b,统计它们不同的位置的数量。对于每个不同的位置,我们都可以选择将这一位变成 4 或 7,然后更新 a 中数字 4 和 7 的数量。最终,我们就可以得到将字符串 a 转换为字符串 b 所需的最少操作数。 时间复杂度 字符串 a 和 b 的长度为 n,我们需要扫描一遍字符串并统计数字 4 和 7 的数量,因此时间复杂度为 O(n)。 空间复杂度 我们只需要存储数字 4 和 7 的数量,因此空间复杂度为 O(1)。 Python 代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值