HDU 5690 All X的多种算法(2016"百度之星" - 初赛(Astar Round2A)1001)

传送门

All X

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 965 Accepted Submission(s): 462

Problem Description

F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:

F(x,m) mod k ≡ c

Input

第一行一个整数T,表示T组数据。

每组测试数据占一行,包含四个数字x,m,k,c

1≤x≤9

1≤m≤1010

0≤c< k≤10,000

Output

对于每组数据,输出两行:

第一行输出:”Case #i:”。i代表第i组测试数据。

第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。

Sample Input

3

1 3 5 2

1 3 5 1

3 5 99 69

Sample Output

Case #1:

No

Case #2:

Yes

Case #3:

Yes

Hint

对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。

第一种就是上这篇博客讲的(暴力算法 累死筛法)点击这里

具体我就不在赘述了

第二种就是快速幂了:

我们首先来看一下这个东西,令ans = xxx.xxx(m个),那么我们可以写成

ans=x?(100+101+...+10m?1)

那么里面是一个等比数列,所以我们可以求一下里面的公式这是化简完的

100+101+...+10m?1=10m?19

那么我们就是要求x*(10^m-1)/9 MOD k是不是==c那么,这里有一个分母我们怎么处理呢,肯定有人在想求逆元呀,但是 GCD(9,k)不一定等于1呀,所以求逆元的方法不能用了,那么怎么办呢,我们可以同时扩大9倍也就是求的 x * (10^m-1)MOD 9k 是不是等于 9 * c,剩下的就是

快速幂了。

上代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;
typedef long long LL;
LL quick_mod(LL a,LL b, LL c)
{
    LL ans = 1;
    while(b)
    {
        if(b&1)
            ans = (ans*a)%c;
        b>>=1;
        a = (a*a)%c;
    }
    return ans;
}

int main()
{
    LL x, m, c, k;
    int T;
    scanf("%d",&T);
    for(int cas=1; cas<=T; cas++)
    {
        cin>>x>>m>>k>>c;
        k *= 9;
        c *= 9;
        LL ans = quick_mod(10,m,k);
        ans = (ans%k+k)%k;
        ans = (ans-1%k+k)%k;
        ans = (ans*x%k+k)%k;
        printf("Case #%d:\n",cas);
        if(ans == c)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}
/**
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---‘\____
             .‘  \\|     |//  `.
            /  \\|||  :  |||//             /  _||||| -:- |||||-             |   | \\\  -  /// |   |
           | \_|  ‘‘\---/‘‘  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .‘  /--.--\  `. . __
      ."" ‘<  `.___\_<|>_/___.‘  >‘"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-‘======
                   `=---=‘
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       每次AC
**/

第三种:就是求循环节,这个应该不是很难把,我就说一一下就行拉,注意的是循环的不一定是从第一项开始的,注意这个就行,具体操作自己实现吧。

时间: 2024-08-04 10:21:21

HDU 5690 All X的多种算法(2016"百度之星" - 初赛(Astar Round2A)1001)的相关文章

2016百度之星-初赛(Astar Round2A)AII X

Problem Description F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据. 每组测试数据占一行,包含四个数字x,m,k,c 1≤x≤9 1≤m≤10^10 0≤c<k≤10,000 Output 对于每组数据,输出两行: 第一行输出:"Case #i:".i代表第i组测试数据. 第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式.

Hdu 5696 区间价值(2016百度之星初赛Astar Round2B )(线段树)

思路来源于:http://blog.csdn.net/kk303/article/details/51479423 注意数组用 long long 存,否则WA. /* Problem : Status : By wf, */ #include "algorithm" #include "iostream" #include "cstring" #include "cstdio" #include "string&q

HDU 5701 中位数计数( 2016&quot;百度之星&quot; - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 852 Accepted Submission(s): 335 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含

HDU 5698 瞬间移动 (2016&quot;百度之星&quot; - 初赛(Astar Round2B) 1003)

传送门 瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 140 Accepted Submission(s): 66 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案

2016&quot;百度之星&quot; - 初赛(Astar Round2A)解题报告

此文章可以使用目录功能哟↑(点击上方[+]) 有点智商捉急,第一题卡了好久,看来不服老,不服笨是不行的了...以下是本人目前的题解,有什么疑问欢迎提出 链接→2016"百度之星" - 初赛(Astar Round2A)  Problem 1001 All X Accept: 0    Submit: 0 Time Limit: 2000/1000 mSec(Java/Others)    Memory Limit : 65536 KB  Problem Description F(x,

hdu 5690 2016&quot;百度之星&quot; - 初赛(Astar Round2A) All X 快速二次幂 || 寻找周期

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690 题意:m个数字全为x mod k ?= c;其中m <= 1010,0 < c,k <= 10,000; 法1:xxx = (10m-1)/9*x;但是n太大,需要同时mod.去除分母将式子变为:10m*x%(9k) - x%(9k) =? 9c ;其中 10m 快速二次幂即可: 时间复杂度为O(logn) 法2: 由于m个x数的产生对于mod具有可拆分性,所以直接求解周期即可: #i

2016&quot;百度之星&quot; - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂

Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint 对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是"No",而第二组测试数据中满足如上公式,所以答案是 "Yes". 解: m个x组成的数可以表示为x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9; 即x*(10^m-1)/9%

hdu 5698 瞬间移动(2016&quot;百度之星&quot; - 初赛(Astar Round2B)——数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5698 瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子

2016&quot;百度之星&quot; - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

Sitting in Line Problem Description 度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十分简单,参与游戏的N个整数将会做成一排,他们将通过不断交换自己的位置,最终达到所有相邻两数乘积的和最大的目的,参与游戏的数字有整数也有负数.度度熊为了在他的数字仆人面前展现他的权威,他规定某些数字只能在坐固定的位置上,没有被度度熊限制的数字则可以自由地交换位置. Input 第一行一个整数T,表示T组数