ZUFE OJ 2301 GW I (3)
生活随笔
收集整理的這篇文章主要介紹了
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
",ans[i]);
return 0;
}
總結
以上是生活随笔為你收集整理的ZUFE OJ 2301 GW I (3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java在虚拟机下的安装_centos
- 下一篇: 重磅消息:微软发布多平台应用UI框架 M