ZUFE OJ 2301 GW I (3)

Description

GW 是ZUFE的神犇,有一天他想到一种神奇的变换,并且将它命名为GW变换

对于一个数字n,该变换后的值GW(n)为,先令X=n

第一步,如果X为个位数,GW(n)=X,否则执行第二步;

第二步,X的奇数位置的数字之和为a,偶数位置的和为b, X=a*b, 执行第一步;

现在我们有T个询问,对于每个询问输入三个整数数l,r,x

对于每个询问请输出在[l,r]这个闭区间里的数经过该变换后为x的数有多少个

Input

第一行是一个T,表示有T组询问(T<=1000)

接下来T行,每行三个整数l,r,x (0<=l<=r<=10000000)

Output

输出T行,每行一个整数,代表着答案。

Sample Input

2

1 10 2

20 25 0

Sample Output

1

2

HINT

第二个样例中满足条件的值分别为20和25

离线操作

#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;

int tot[10];
int ans[1000+10];
int T;
int GW[10000000+10];
int r[1000],d;

struct Quary
{
    bool flag;//flag==0表示是起点 flag==1表示是终点
    int t;//第几组的询问
    int u;
    int x;//要询问数字
}Q[2000+10];

bool cmp(const Quary&a,const Quary&b)
{
    if(a.u==b.u) return a.flag<b.flag;
    return a.u<b.u;
}

void init()
{
    memset(tot,0,sizeof tot);
    memset(ans,0,sizeof ans);
}

int Tra(int x)
{
    d=0;
    int A=0,B=0;
    while(x)
    {
        r[d]=x%10;
        x=x/10;
        d++;
    }
    for(int i=0;i<d;i++)
    {
        if(i%2==0) A=A+r[i];
        else B=B+r[i];
    }
    return A*B;
}

void F()
{
    for(int i=0;i<=9;i++) GW[i]=i;
    for(int i=10;i<=10000000;i++) GW[i]=GW[Tra(i)];
}

int main()
{
    F();
    scanf("%d",&T);
    init();
    int zzt=0;
    for(int i=1;i<=T;i++)
    {
        int L,R,X;
        scanf("%d%d%d",&L,&R,&X);
        if(X>9||X<0) {ans[i]=0;continue;}

        Q[zzt].flag=0;
        Q[zzt].t=i;
        Q[zzt].u=L;
        Q[zzt].x=X;
        zzt++;

        Q[zzt].flag=1;
        Q[zzt].t=i;
        Q[zzt].u=R;
        Q[zzt].x=X;
        zzt++;
    }
    sort(Q,Q+zzt,cmp);

    int now=0;
    for(int i=0;i<zzt;i++)
    {
        if(Q[i].flag==0)
        {
            for(int j=now;j<Q[i].u;j++) tot[GW[j]]++;
            ans[Q[i].t]=tot[Q[i].x];
            now=Q[i].u;
        }
        else if(Q[i].flag==1)
        {
            for(int j=now;j<=Q[i].u;j++) tot[GW[j]]++;
            ans[Q[i].t]=tot[Q[i].x]-ans[Q[i].t];
            now=Q[i].u+1;
        }
    }
    for(int i=1;i<=T;i++) printf("%d\n",ans[i]);
    return 0;
}
时间: 2024-12-29 23:50:27

ZUFE OJ 2301 GW I (3)的相关文章

ZUFE OJ 2288 God Wang I

Description God Wang 是ZUFE的神犇,有一天他想到一种神奇的变换,并且将它命名为GodW变换 对于一个数字n,该变换后的值GodW(n)为,先令X=n 第一步,如果X为个位数,GodW(n)=X,否则执行第二步; 第二步,X的奇数位置的数字之和为a,偶数位置的和为b, X=a*b, 执行第一步; 现在我们有T个询问,对于每个询问输入三个整数数l,r,x 对于每个询问请输出在[l,r]这个闭区间里的数经过该变换后为x的数有多少个 Input 第一行是一个T,表示有T组询问(T

ZUFE OJ 2145 05机关图

Description Ink最近得到了一张藏宝图,这张图上共有n个藏宝室,但因为年代久远藏宝图上的路已经模糊不清,于是Ink找到了智慧的Pseudo,Pseudo告诉Ink,这个宝藏中每两个藏宝室之前都有一条通路,每条通路上都有一定数量的机关.现在Ink已经探明了其中n-1条路上的机关数目,这n-1条路不构成任何环路.众所周知Ink是个乐天派,他坚持认为自己探明的这些路构成的无环联通子图中机关总数是唯一且最少的,现在假设他的想法是对的,他想知道整个图中最少共有多少机关? Input 第一行是一

ZUFE OJ 2289 God Wang II

Description 这个世界太无聊了,于是God Wang想出了新的运算符号$,对于两个数x,y来说x$y的值等于x和y各个位置上的数字乘积之和,没有的位按0来算 比如说123$321=1*3+2*2+3*1=10,105$51=1*0+0*5+5*1=5.于是God Wang又有了新的问题, 他定义了函数F(L,R)=(((((L$(L+1))$(L+2))$(L+3)....)$R),他想要知道F(L,R)的值,现在请你来告诉他吧. Input 输入第一行为一个正整数T(T<=1000)

哈理工 OJ 2301 行编辑器(java)

行编辑器 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 513(211 users) Total Accepted: 297(201 users) Rating:  Special Judge: No Description 这次我们要写一个简单的行编辑器,当按下‘#’时代表按下了一次退格符,当按下‘@’时代表一个退行符(使当前行的字符全部无效).例如,假设从终端接收了这样的两行字符: Whil#lr#e(s#*s) [email

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

LeetCode OJ - Longest Consecutive Sequence

这道题中要求时间复杂度为O(n),首先我们可以知道的是,如果先对数组排序再计算其最长连续序列的时间复杂度是O(nlogn),所以不能用排序的方法.我一开始想是不是应该用动态规划来解,发现其并不符合动态规划的特征.最后采用类似于LRU_Cache中出现的数据结构(集快速查询和顺序遍历两大优点于一身)来解决问题.具体来说其数据结构是HashMap<Integer,LNode>,key是数组中的元素,所有连续的元素可以通过LNode的next指针相连起来. 总体思路是,顺序遍历输入的数组元素,对每个

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar

light oj 1236 【大数分解】

给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,--em, 则结果为((1+2*e1)*(1+2*e2)--(1+2*em)+1)/2. //light oj 1236 大数分解素因子 #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #i

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返