FZU 2125 简单的等式

题目链接:简单的等式

比赛的时候感觉没有思路,大腿说可能是枚举想一下有什么限制好了。然后莫名想出S(x, m)是有一个范围的,然后告知大腿,大腿敲之,WA之,发现maxn应该是10^18,num[i]的最大还是应该是10^9的。【据大腿说改成10^18就过了,然刚试了下,10^9即可。】

赛后重敲的时候,num数组想错了,比如说,10^10用m进制表示时,位数之和最大应该是9*9+1。然我算成10了。

还有个坑点在哪呢.....输入的时候n需要用long long表示 如果是%ll 就WA,如果是%I64d就AC,当然cin 大法也没有问题.....【遇见两次了,不解】

无脑的逐行排除才发现...以后再也不这样dbug了....T_T

附AC代码:

/*
思路:对于给定的m,S(x, m) 的范围可以确定最大值。
S(x, m) = n / x - x,函数递减,所以遍历x的时候,从sqrt(n) 遍历到S(X, m)递增到最大值过程中得到的满足条件的x的最小值即为ans.
*/

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <cmath>
#define maxn 1e9
using namespace std;

long long num[20];

void init() { // 计算maxn表示成进制时,各位之和相加的最大值
    for (int i=2; i<=16; ++i) {
        long long st = 1;
        int ans = 0;
        while(st <= maxn) {
            st *= i;
            ans += i-1;
        }
        num[i] = ans-i+1;
    }
}

int get(long long x, int m) { // 计算x写成m进制各位相加之和
    long long st = x;
    int ans = 0;
    while(st) {
        ans += st % m;
        st /= m;
    }
    return ans;
}

int main() {
    init();
    int t;
    scanf("%d", &t);
    while(t--) {
        long long n;
        int m;
        scanf("%I64d%d", &n, &m);
        long long st = (long long)sqrt(n);
        long long ans = -1;

        for (long long i=st; i>0; --i) {
            if (n / i - i > num[m]) break;
            if (n%i != 0) continue;
            if (n / i - i == get(i, m)) {
                ans = i;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

对于这道题,从没有思路到想出S(x, m)限制,到代码实现都值得思考呢......

时间: 2024-10-05 05:27:45

FZU 2125 简单的等式的相关文章

FZU - 2204 简单环形dp

FZU - 2204 简单环形dp 题目链接 n个有标号的球围成一个圈.每个球有两种颜色可以选择黑或白染色.问有多少种方案使得没有出现连续白球7个或连续黑球7个. 输入 第一行有多组数据.第一行T表示组数.(T <= 20) 每组包含n,表示球的个数.(1 <= n <= 100000) 输出 每组先输出 "Case #x: " (其中x为当前组数) 该行接下来输出方案数.方案数mod 2015. 样例 2 7 1 Case #1: 126 Case #2: 2 思路

FZU 2183 简单题(字符串匹配|字符串压缩)(简单)

Problem 2183 简单题 Accept: 138    Submit: 641 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 现在有一些被简单压缩的字符串,例如:a[120]代表120个a.对于字符串acb[3]d[5]e相对于acbbbddddde 现在给你两个字符串cString, nString.一个是被压缩过的字符串,另一个没有被压缩. 求nString是否为cString的子串,如果是

笨办法学Python(二十一)

习题 21: 函数可以返回东西 你已经学过使用 = 给变量命名,以及将变量定义为某个数字或者字符串.接下来我们将让你见证更多奇迹.我们要演示给你的是如何使用 = 以及一个新的 Python 词汇return 来将变量设置为"一个函数的值".有一点你需要及其注意,不过我们暂且不讲,先撰写下面的脚本吧: 1 def add(a, b): 2 print "ADDING %d + %d" % (a, b) 3 return a + b 4 5 def subtract(a

机器学习:从入门到沉迷之机器的思考方式

一般情况下我们人类大脑可以在没有明确指示的情况下处理绝大部分问题.例如,你做房产经纪时间很长,你对于房产的合适定价.它的最佳营销方式以及哪些客户会感兴趣等等都会有一种本能般的“感觉”.强人工智能(Strong AI)研究的目标就是要让计算机能这样思考. 但是目前的机器学习算法还没有那么好——它们只能专注于非常特定的.有限的问题.也许在这种情况下,“机器学习”更贴切的定义是“在少量范例数据的基础上找出一个等式来解决特定的问题”. 不幸的是,“机器在少量范例数据的基础上找出一个等式来解决特定的问题”

BNUOJ 34985 Elegant String 2014北京邀请赛E题 动态规划 矩阵快速幂

Elegant String Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,-, k

20170906

水题 T1 Arpa and a research in Mexican wave CodeForces - 851A 1 #include<cstdio> 2 int n,k,t; 3 int main() 4 { 5 scanf("%d%d%d",&n,&k,&t); 6 if(t>=k&&t<=n) 7 printf("%d",k); 8 else if(t<k) 9 printf(&quo

【初等数论】 02 - 整除与公约数

当从这里开始的时候,你的行囊里不需要太多的东西,只要会整数的加减乘除即可.东西多了不仅帮不了你,反而会成为前进的负担.正如在前两篇中一样,你需要首先抛开一切固有思维,清空大脑,带着孩童般的好奇心重新认识这个世界.由于数论经常出现于奥数和智力题中,它往往被当成一种智力游戏,但随着研究的深入,你需要建立一套理论才能看清本质.我们可以从最简单的定义出发,利用理性思维建立这些理论.做题是学习数论的必经途径,你需要在不断地思考中才能有更深刻的理解,但这里我只打算叙述最基础的思想和结论. 1. 整除 数论研

数据建模与框架设计的暂时总结

在这次项目开发实践中,我又一次尝试用Python脚本生成C#代码,其效果让我很满意 -- 提高了代码质量,可维护性和工作效率:同时降低了出错率. 看来事情在向好的方面发展.那么促成的因素是什么?我思考了一下,可能有以下2点: 在用脚本生成代码方面积累的实践技术经验 在运用第1点时,让我感受到了“数据建模”和“框架设计” 回忆这次设计过程,我首先识别了下面几个部分的数据: 前端展示数据 业务层数据 数据层数据 通过一个Excel表格,将这三层数据定义出来,然后再用脚本生成代码.但是,由于这次的业务

提升编程能力的11个技巧

提升编程能力的11个技巧 1.首先仔细分析问题 2.接着好好想想如何解决这个问题 3.收集整理所有需求 花点时间将最终产品要实现的目标写下来,并且明确哪些是我们的目标用户群.如果这一步能做好的话,将会给后面节约大量的时间,正所谓磨刀不误砍柴工. 4.写一个全面的实施计划(或模型) 如果是个小项目,这一步出来的可能只是一个基本的流程或者一个简单的等式. 如果是个比较大的项目,这一步有助于我们将它切割成几个模块,然后再按下面的问题思考: ●各个模块需要执行什么任务 ●模块之间如何传递数据 ●如何调用