BZOJ2900 好玩的数字游戏

好玩的数字游戏

TK在虐题的同时,也喜欢玩游戏。
现在,有这样的一个游戏,规则是这样的:
先随机给出一个数字N,然后你在操场上把1到N的所有数字写成一排,就像这样:
123456789101112131415….
接着你在每个数字前面添上加减号,每逢排在奇数位上的数字,就写上加号;每逢排在偶数位上的数字,就写上减号。恩…最后你得到一个超级长的式子。并且可以算出这个式子的结果。
TK觉得这个游戏很有意思,于是他没日没夜地玩啊玩啊玩啊…
或许你觉得这个游戏没有意思…恩…但是,如果你是TK,对于给定的N,你能够算出来最后的结果应该是多少么?

输入格式:

多组数据。每个测试点的数据组数不超过1000组。
每一行仅一个正整数N。保证没有多余的什么奇怪的字符。
每个测试点的数据最后一行一定是数字0。代表这个测试点的结束。

输出格式:

对于每组数据,输出相应的结果。

大部分方法都是数位dp 我感到对奇偶性的分析不是很清晰 于是听到了czt的做法::

对于一个K位长的数,在第J位上,数字为I 对最终结果的贡献,,

一个直观的规律 把I这个数在J位上删去以后 发现剩下的数位顺序写下的数字即是 它的项数

另一个直观的规律 发现对于上面提到的状态 依次写下对答案的贡献以后 发现它是一个 公比为1 或者-1 的等比数列!!!

于是就可以使用数学方法完成这题了

ps: 这题还是关于奇偶的分析太蛋疼 大脑内存太小了 有没有什么方法能改进改进??

 1 #include<cstdio>
 2 #define ll long long
 3 using namespace std;
 4 ll ans,n,pows[19];
 5 int main()
 6 {
 7     pows[0]=1; for(int i=1;i<=18;i++)
 8         pows[i]=pows[i-1]*10;
 9     while(1)
10     {
11         scanf("%lld",&n); if(n==0) return 0;
12         for(int i=1;i<=9;i++)for(int j=0;j<=15;j++)for(int k=j;k<=15;k++)
13         {
14             ll start,end,fr;
15             if(pows[j]*i+(k>j)*pows[k]>n) continue;
16             start=j==k?0:pows[k-1];
17             if(n>=pows[j]-1+pows[j]*i+pows[k+1]-pows[j+1]) end=pows[k]-1;
18             else if(n%pows[j+1]/pows[j]<i)
19                 end=n/pows[j+1]*pows[j]-1;
20             else if(n%pows[j+1]/pows[j]==i)
21                 end=n/pows[j+1]*pows[j]+n%pows[j];
22             else end=n/pows[j+1]*pows[j]+pows[j]-1;
23             fr=(((i&1&&j==0&&(k&1)==0)^(k&1)^(j&1))*2-1)*i;
24             if((k&1)==0&&j)
25             {
26                 if(((start^end)&1)==0) ans+=fr;
27             }
28             else ans+=(end-start+1)*fr;
29         }
30         printf("%lld\n",ans);ans=0;
31     }
32 }
时间: 2024-12-23 18:39:02

BZOJ2900 好玩的数字游戏的相关文章

CASIO 5800P计算器游戏--猜数字游戏

CASIO 5800P 计算器游戏--猜数字游戏原代码 我编的计算器小游戏--猜数字游戏 LbI I "xxGUESS NUMBERxx xPROGRAMMER:JCHx ---------------- START>>>>>>>[EXE]"◢ LbI Q "xxxDIFFICULTYxxx [1EASY] [2MIDDLE] [3HARD]"?→N: N=1=>GOTO N:N=2=>GOTO O: N=3=&

数字游戏&amp;寒假祭

区间DP 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3)

Vijos P1218 数字游戏

描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 格式 输入格式 输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9).以下n行每行有个整数,其绝对值不大于10^410?4??,按顺序给出圈中的数字,首尾相接. 输出

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

猜数字游戏及rand()函数

#include<stdio.h>#include<stdlib.h>int main() { short number; short guess=0; number=rand()%100; number++; printf("猜数字游戏\n"); printf("该数字在1到100之间\n"); while(guess!=number) { printf("请你输入所猜数字:"); scanf("%hd&quo

DP——数字游戏

Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 当要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4

原创Android游戏--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

--------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添加的功能,以及一些可改进的地方,于是准备继续完善此游戏,顺便学Android了. 本次更新信息如下: 1.改正了随机数生成算法,更正了不能产生数字'9'的bug 2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据 3.保存数据为: 总盘数,猜中的盘数 4.使用了Simp

*循环-20. 猜数字游戏

1 /* 2 * Main.c 3 * C20-循环-20. 猜数字游戏 4 * Created on: 2014年8月18日 5 * Author: Boomkeeper 6 *********测试部分通过********* 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 int random = 0,N = 0;//系统输入的随机数和最大猜测次数 14 int in = 0;//每次输入的猜测 15 int count = 0

XDU1160 - 科协的数字游戏I

Description 科协里最近很流行数字游戏.某人命名了一种不降数,这种数字必须满足从左到右各位数字成大于等于的关系,如123,446.现在大家决定玩一个游戏,指定一个整数闭区间[a,b],问这个区间内有多少个不降数. Input 题目有多组测试数据.每组只含2个数字a, b (1 <= a, b <= 2^31). Output 每行给出一个测试数据的答案,即[a, b]之间有多少阶梯数. Sample Input 1 9 1 19 Sample Output 918 数位DP基础题: