洛谷[P1662]世纪难题 数7 打表,模拟

题目链接http://www.luogu.org/problem/show?pid=1662

题目描述

1337个人排成一个圈,从1号人开始报数,初始方向是1,2,3…。如果某个人报的数是7的倍数或数字中含有7,那么报数的方向就反一下。问报数字X的是哪个人?

比如初始20个数字的情况是:

1:1 2:2 3:3 4:4 5:5 6:6 7:7 6:8 5:9 4:10 3:11 2:12 1:13 1337:14 1:15 2:16 3:17 2:18 1:19 1337:20

输入输出格式

输入格式:
一行一个数X。

【数据规模】

对于30%的数据,满足X≤10^6;

对于90%的数据,满足X≤10^8;

对于100%的数据,满足X≤10^9.

输出格式:
一行一个数表示最终报数字X的是哪个人。

这,就是暴力的下场
这里写图片描述

打个包括所有能使方向改变的数的表,然后二分查找,这样的复杂度感觉会有所降低,但不幸的是10^9数据太大打出的表居然大到6G(不要问我怎么知道的才不是我表打错了

我们可以将i*10^6当做每段的分界点,则每一段仅有最多数 106 个数字,定义 sum[i]dir[i] 分别为数到 i106 的人是哪位以及当前的朝向,打出 dir sum 的表,这样就可以将问题转化为从 sum[n/106] 位置以 dir[n/106] 的初始方向数到 nn/106106 的问题,将 109 的问题转化为 106 的问题。


代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,num,seat;
int seq;
bool t;
int sta=0;
int a[26];
int len;
int sum[1010]={0,469,139,1086,768,860,1200,837,837,507,117,1136,1228,231,1205,337,7,954,954,862,522,885,416,746,1136,117,25,1022,1022,154,1161,  
                771,453,545,885,522,991,661,661,979,887,547,910,441,771,1161,142,50,50,1024,156,1163,773,455,547,887,524,993,993,46,364,272,1269,  
                295,1163,156,546,864,864,1204,841,841,841,841,841,841,841,841,841,841,841,523,615,955,592,1061,731,341,341,249,1246,272,1140,133,  
                523,841,749,409,409,878,548,158,1177,1269,272,1246,378,48,48,366,274,1271,297,1165,158,548,866,774,774,411,880,550,160,1179,1271,  
                274,1248,380,380,770,1088,996,656,1019,550,880,1270,251,251,591,228,697,367,1314,996,1088,91,1065,1065,735,345,27,119,459,96,565,  
                235,1182,1182,1090,750,1113,644,974,27,345,253,1250,1250,382,52,52,52,52,52,52,52,52,52,52,52,1049,75,943,1273,326,644,552,552,189,  
                658,328,1275,957,1049,52,1026,158,158,548,866,774,434,797,328,658,1048,29,29,369,6,475,145,1092,774,866,1206,843,843,513,123,1142,1234,  
                237,1211,343,13,960,960,868,528,891,422,752,1142,123,31,1028,1028,160,1167,777,459,551,891,528,997,667,667,985,893,553,916,447,777,  
                1167,148,56,56,1030,162,1169,779,461,553,893,530,999,999,52,370,370,370,370,370,370,370,370,370,370,370,839,509,119,1138,1230,233,1207,  
                1207,877,487,169,261,601,238,707,377,1324,1324,1232,892,1255,786,1116,169,487,395,55,55,524,194,1141,823,915,1255,892,24,1031,1031,12,  
                1257,917,1280,811,1141,194,512,420,420,57,526,196,1143,825,917,1257,894,26,26,416,734,642,302,665,196,526,916,1234,1234,237,1211,343,  
                13,960,642,734,1074,711,711,381,1328,1010,1102,105,1079,211,1218,828,828,736,396,396,396,396,396,396,396,396,396,396,396,786,1104,1012,  
                672,1035,566,896,896,578,670,1010,647,1116,786,396,78,170,170,533,64,394,784,1102,1010,670,1033,564,564,174,1193,1285,288,1262,394,64,  
                1011,693,693,353,716,247,577,967,1285,1193,853,1216,1216,209,599,917,825,485,848,379,709,1099,1099,1191,194,1168,300,1307,917,599,  
                691,1031,1031,562,892,1282,263,171,1168,194,1062,55,55,1074,1166,169,1143,275,1282,892,574,666,666,1029,560,560,560,560,560,560,560,  
                560,560,560,560,652,992,629,1098,768,378,60,60,1057,83,951,1281,334,652,560,220,583,583,913,1303,284,192,1189,215,1083,76,466,466,  
                558,898,535,1004,674,284,1303,58,398,398,1266,259,649,967,875,535,898,429,759,759,441,533,873,510,979,649,259,1278,33,33,396,1264,  
                257,647,965,873,533,896,427,427,37,1056,1148,151,1125,257,1264,874,556,556,216,579,110,440,830,1148,1056,716,1079,1079,72,462,462,  
                462,462,462,462,462,462,462,462,462,99,568,238,1185,867,959,1299,1299,830,1160,213,531,439,99,462,1330,323,323,5,97,437,74,543,213,  
                1160,842,934,934,1297,828,1158,211,529,437,97,460,1328,1328,938,620,712,1052,689,1158,828,438,120,120,1117,143,1011,4,394,712,620,  
                280,643,643,973,26,344,252,1249,275,1143,136,526,526,618,958,595,1064,734,344,26,118,458,458,1326,319,709,1027,935,595,958,489,819,  
                819,501,593,593,593,593,593,593,593,593,593,593,593,263,1210,892,984,1324,961,93,93,483,801,709,369,732,263,593,983,1301,1301,304,  
                1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,  
                1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,  
                1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,  
                1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,331,649,557,217,  
                580,111,441,441,123,215,555,192,661,331,1278,960,1052,1052,78,946,1276,329,647,555,215,578,109,109,1056,738,830,1170,807,1276,946,  
                556,238,238,1235,261,1129,122,512,830,738,398,761,761,1091,144,462,370,30,393,1261,254,644,644,736,1076,713,1182,852,462,144,236,  
                576,576,107,437,437,437,437,437,437,437,437,437,437,437,777,414,883,553,163,1182,1274,1274,300,1168,161,551,869,777,437,800,331,331,  
                1278,960,1052,55,1029,161,1168,778,460,460,120,483,14,344,734,1052,960,620,983,983,1313,366,684,592,252,615,146,476,866,866,958,1298,  
                935,67,1074,684,366,458,798,798,329,659,1049,30,1275,935,1298,829,1159,1159,841,933,1273,910,42,1049,659,341,433,433,796,327,657,1047,  
                28,1273,933,1296,827,827,437,119,119,119,119,119,119,119,119,119,119,119,987,1317,370,688,596,256,619,619,949,2,320,228,1225,251,1119,112,502,502,594,934};
int dir[1010]={1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,  
                 -1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,  
                 -1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,  
                 1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,  
                 -1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,  
                 1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,  
                 -1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,  
                 1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,  
                 -1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  
                 -1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,  
                 -1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  
                 1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,  
                 -1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,  
                 1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,  
                 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,  
                 1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,  
                 1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,  
                 -1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,  
                 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1};  
inline void jw();
inline void cs();
inline bool pd(int);
inline void limit();
inline void csh(int);
int main(){
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    sta=n/1000000*1000000+1;
    seq=dir[n/1000000];
    seat=sum[n/1000000];
    csh(sta-1);
    for(int i=sta;i<=n;i++){
        seat+=seq;
        limit();
        a[1]++;
        jw();
        if(i%7==0 || (pd(len)))
            seq=-seq;
    }
    printf("%d",seat);

return 0;
}
inline bool pd(int k){
    for(int i=9;i>=1;i--)
        if(a[i]==7)
            return true;
    return false;
}
inline void limit(){
    if(seat<=0)
       seat=1337-seat;
    if(seat>1337)
       seat=seat-1337;
}
inline void cs(){
    cout<<seat<<" "<<num<<" ";
    for(int i=len;i>=1;i--)
       cout<<a[i];
    cout<<" "<<t<<endl;
}
inline void jw(){
    int j=1;
    while(a[j]>=10){
        a[j+1]+=a[j]/10;
        a[j]=a[j]%10;
        j++;
        if(j>len)
           len=j;
    }
}
inline void csh(int k){
    if(k%10){
        a[1]=k%10;
        len=1;
    }
    if(k/10%10){
        a[2]=k/10%10;
        len=2;
    }
    if(k/100%10){
       a[3]=k/100%10;
        len=3;
    }
    if(k/1000%10){
        a[4]=k%1000;
        len=4;
    }
    if(k/10000%10){
        a[5]=k/10000%10;
        len=5;
    }
    if(k/100000%10){
       a[6]=k/100000%10;
        len=6;
    }
    if(k/1000000%10){
       a[7]=k/1000000%10;
        len=7;
    }
    if(k/10000000%10){
       a[8]=k/10000000%10;
        len=8;
    }
    if(k/100000000%10){
       a[9]=k/100000000%10;
        len=9;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值