【u236】火炬

Time Limit: 1 second
Memory Limit: 128 MB

2008北京奥运会,你想成为四川汶川的一名火炬手,结果层层选拔,终于到了最后一关,这一关是一道很难的题:任意给定一个正整数N(N<=100000),求一个最小的正整数M,使得N*M的十进制表示形式里只含有1和0.

【输入格式】

一行,输入一个整数N。

【输出格式】

输出一行,如果有解,输出最小的M,否则输出“No Solution”

【数据规模】

100%的数据保证答案不超过1000000。

Sample Input1

12
Sample Output1

925

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u236

【题解】

题目给的最后的答案范围不对;
最后的答案最大可能为14708277972909
(并不是题目描述的100W);
所以两个数的乘积会非常大;
但数据会保证两个数的乘积用long long能存的下(最后答案很大的话它相应的输入的N减小了一点);
做法:
首先找到第一个大于n的数字x(x满足所有的数字仅有0和1构成);
之后再用二进制进位的规则不断地给这个数字加1就好;
比如
101001
+1
101010
只不过不是真的加1;比如上面实际上就是加10了;
且这样总能满足数字全由0和1组成;
且为最小;(这样加最多只要加20W次,妥妥地不超);
然后看看能不能被n整除
如果能
就直接输出这个数字除m的结果;就是答案了;
然后结束程序;
//如果直接按照十进制加1枚举,每次还要判断这个数字是不是全由01组成;而且枚举量是巨大的;实际上最多要枚举1e18次。。呵呵

【完整代码】

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

void rel(LL &r)
{
    r = 0;
    char t = getchar();
    while (!isdigit(t) && t!='-') t = getchar();
    LL sign = 1;
    if (t == '-')sign = -1;
    while (!isdigit(t)) t = getchar();
    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
    r = r*sign;
}

void rei(int &r)
{
    r = 0;
    char t = getchar();
    while (!isdigit(t)&&t!='-') t = getchar();
    int sign = 1;
    if (t == '-')sign = -1;
    while (!isdigit(t)) t = getchar();
    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
    r = r*sign;
}

const int MAXN = 10+20;
const LL INF = 8e18;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);

string s;
int a[MAXN];
int len;

LL fi(int b[MAXN])
{
    LL t = 0;
    rep2(j,len,1)
        t=t*10+b[j];
    return t;
}

int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    cin >>s;
    reverse(s.begin(),s.end());
    len = s.size();
    rep1(i,1,len)
        a[i] = s[i-1]-'0';
    LL n = fi(a);
    rep1(i,1,len)
    if (a[i]>1)
    {
        int j = i+1;
        while (j<=len && a[j]>1) j++;
        j--;
        a[j]=0;a[j+1]++;
        rep1(k,1,j-1)
            a[k] = 0;
    }
    if (a[len+1]>0)len++;
    LL t=fi(a);
    while (t<INF)
    {
        if (t%n==0)
        {
            LL ans = t/n;
            cout << ans << endl;
            return 0;
        }
        a[1]++;
        rep1(i,1,len)
            if (a[i]>1)
                a[i+1]++,a[i] = 0;
        if (a[len+1]>0) len++;
        t = fi(a);
    }
    puts("No Solution");
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626901.html

本系统是一个Struts+Spring+Hibernate组合开发的博客系统,本系统使用分层体系架构,综合运用struts+spring+hibernate 三大主流开源框架构建,稳定高效、功能强大、易于维护。 本系统是一个先进的博客系统,能基本完整的实现博客的功能,主要有以下功能:<br> 1。用户注册登录功能。用户可以在网站上注册一个帐户,建立自己的博客,用户可以登录到自己的管理界面,管理文章、评论、相片、个人信息等。<br> 2。博客首页功能。可显示火炬博客系统的全面信息,如最新文章、热门文章等。<br> 3。我的首页功能。可显示个人博客的全面信息,如最新文章、最新评论、作者相片、日历等。<br> 4。博客管理功能。用户可以管理自己的博客,包括文章管理、评论管理、相片管理、档案管理、类别管理、个人资料管理、注册信息管理等。<br> 5。写文章功能。本系统采用流行的FCKEditor编辑器,提供强大的编辑和排版功能,文章可实现优美的显示效果。<br> 6。评论功能。访问者可对文章发表评论。<br> 7。留言功能。访问者可给每个博客留言。<br> 8、搜索功能。可按不同项目进行搜索。<br> 9。Tag功能。文章可产生多个相关Tag,可按不同Tag进行搜索。<br> 10。RSS功能。本系统采用先进的RSS2.0技术,实现RSS功能,便于浏览。<br> 11。相册功能。可浏览博客相片。<br> 12。个人档案功能。可浏览博客个人资料。 <br> 13。找回密码功能。可通过问回答找回密码。。<br> 14。聊天功能。访问者和用户可在线聊天,可以群聊,也可以私聊,反应快速,功能强大。 <br> 15。博客统计功能。可统计博客系统的基本信息。<br> 16。访问人数统计功能。可统计网站在线访问人数。<br> 17。分页功能。本系统具备完善的分页功能。<br> 18。连接池功能。本系统采用连接池技术,解决了数据库瓶颈,大大提高了运行速度。<br> 19。注销功能。可安全退出系统。<br> 20。防重复提交功能。本系统还采用Struts的Token机制和JavaScript技术实现绝对安全的防重复提交功能。 <br> 21。文章管理。可修改、删除文章。<br> 22。评论管理。可回复、删除评论。<br> 23。相片管理。可上传相片,设置主肖像,删除相片。<br> 24。档案管理。可按月建立档案,浏览档案。<br> 25 。类别管理。可建立、修改、删除类别。<br> 26。个人资料管理。可输入修改个人资料。<br> 27。 注册信息管理。可输入修改注册信息,包括修改密码。<br> 28。 错误和异常管理。可处理错误情况,提示错误信息。<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值