fzuoj Problem 2179 chriswho

时间:2022-08-26 10:19:21

http://acm.fzu.edu.cn/problem.php?pid=2179

Problem 2179 chriswho

Accept: 57    Submit: 136 Time Limit: 10000 mSec    Memory Limit : 327680 KB

fzuoj Problem 2179 chriswho Problem Description

Chriswho很喜欢数字,特别喜欢一种数字,它能整除它的每一位数字(如果该位是0当做能整除),比如说126这个数字他就很喜欢,因为126%1=126%2=126%6=0。为了让更多的人喜欢这样的数,他决定出一道这样的题目。求解1到n(包括1和n)之间有多少个这样的数字。

fzuoj Problem 2179 chriswho Input

第一行是一个整数t表示case数(不超过10组)。接下来t行,每行一个整数n(1<=n<=9*10^18)。

fzuoj Problem 2179 chriswho Output

输出t行,每行包括一个数字,表示满足条件的数字个数。

fzuoj Problem 2179 chriswho Sample Input

2 9 15

fzuoj Problem 2179 chriswho Sample Output

9 13

fzuoj Problem 2179 chriswho Source

FOJ有奖月赛-2014年11月

 
 
分析:

因为1-9的lcm是2520,所以对于每一个数模2520,余数如果是自己的lcm的倍数那么就是。

所以dp[i][j][k]代表位数为i,模2520为j,lcm为k的数个数。

枚举后面加的数字g,用dp[i][j][k]去更新dp[i+1][(j*10+g)%2520][lcm(g,k)]。

还要注意一点lcm的个数只有48个,所以就可以开一个数组映射。

写了2种写法,递推写法因为有大量状态浪费速度相当慢。

DFS则快很多

 
 
AC代码:
 
 
 //#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdlib>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<string.h>
#include<string>
#include<sstream>
#include<bitset>
using namespace std;
#define ll long long
#define ull unsigned long long
#define eps 1e-11
#define NMAX 1000000005
#define MOD 1000000007
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1)
template<class T>
inline void scan_d(T &ret)
{
char c;
int flag = ;
ret=;
while(((c=getchar())<''||c>'')&&c!='-');
if(c == '-')
{
flag = ;
c = getchar();
}
while(c>=''&&c<='') ret=ret*+(c-''),c=getchar();
if(flag) ret = -ret;
}
ll dp[][][];
int lcm[][],biao[],m[];
map<int,int>mp;
int gcd(int a,int b)
{
return (b == )?a:gcd(b,a%b);
} void init()
{
for(int i = ; i <= ; i++)
for(int j = ; j <= ; j++)
lcm[i][j] = i?i*j/gcd(i,j):j;
int nct = ;
for(int i = ; i <= ; i++) if(%i == )
{
m[i] = nct;
biao[nct++] = i;
}
biao[] = ;
// cout<<biao[48]<<endl;
} char ch[];
int main()
{
#ifdef GLQ
freopen("input.txt","r",stdin);
// freopen("o4.txt","w",stdout);
#endif // GLQ
init();
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%s",ch);
int len = strlen(ch);
memset(dp,,sizeof(dp));
for(int i = ; i < ch[]-''; i++)
dp[][i][biao[i]] = ;
int ha[];
ha[] = ha[] = ch[]-'';
for(int i = ; i < len; i++)
{
int p = (i==len-)?ch[i]-''+:ch[i]-'';
for(int j = ; j < p; j++)
dp[i][(ha[]*+j)%][m[lcm[j][ha[]]]] = ;
ha[] = (ha[]*+p)%;
ha[] = lcm[p][ha[]];
int num = ch[i]-'';
for(int j = ; j < ; j++)
for(int k = ; k <= ; k++) if(dp[i-][j][k])
{
ll d = dp[i-][j][k];
for(int l = ; l <= ; l++)
{
int lc = m[lcm[l][biao[k]]];
// cout<<l<<" "<<lc<<" "<<lcm[l][biao[k]]<<endl;
dp[i][(j*+l)%][lc] += d;
}
}
}
ll ans = ;
for(int i = ; i < ; i++)
for(int j = ; j <= ; j++)
{
if(i%biao[j] == ) ans += dp[len-][i][j];
}
if(len == ) ans++;
ans--;
printf("%I64d\n",ans);
}
return ;
}
 //#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdlib>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<string.h>
#include<string>
#include<sstream>
#include<bitset>
using namespace std;
#define ll long long
#define ull unsigned long long
#define eps 1e-11
#define NMAX 1000005
#define MOD 1000000007
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1)
template<class T>
inline void scan_d(T &ret)
{
char c;
int flag = ;
ret=;
while(((c=getchar())<''||c>'')&&c!='-');
if(c == '-')
{
flag = ;
c = getchar();
}
while(c>=''&&c<='') ret=ret*+(c-''),c=getchar();
if(flag) ret = -ret;
}
ll dp[][][];
int mp[],ha[],lcm[][],shu[]; int gcd(int x, int y)
{
return y?gcd(y,x%y):x;
} void init()
{
memset(dp,-,sizeof(dp));
int nct = ;
for(int i = ; i <= ; i++) if(%i == )
{
ha[nct] = i;
mp[i] = nct++;
}
for(int i = ;i <= ; i++)
for(int j = ; j <= ; j++)
lcm[i][j] = (i==)?j:i*j/gcd(i,j);
} ll dfs(int yu, int lc, int len,int limit)
{
if(len == )
return yu%ha[lc] == ;
if(~dp[len][yu][lc] && !limit) return dp[len][yu][lc];
ll ans = ;
int p = limit?shu[len]:;
for(int i = p; i >= ; i--)
{
ans += dfs((yu*+i)%, mp[lcm[i][ha[lc]]],len-, limit && i == shu[len]);
}
if(!limit) dp[len][yu][lc] = ans;
return ans;
} int main()
{
#ifdef GLQ
freopen("input.txt","r",stdin);
// freopen("o4.txt","w",stdout);
#endif // GLQ
int cas;
ll n;
init();
scanf("%d",&cas);
while(cas--)
{
scanf("%I64d",&n);
int nct=;
while(n)
{
shu[nct++] = n%10LL;
n /= 10LL;
}
// cout<<nct<<endl;
printf("%I64d\n",dfs(,,nct-,)-);
}
return ;
}

fzuoj Problem 2179 chriswho的更多相关文章

  1. fzuoj Problem 2129 子序列个数

    http://acm.fzu.edu.cn/problem.php?pid=2129 Problem 2129 子序列个数 Accept: 162    Submit: 491Time Limit: ...

  2. fzuoj Problem 2182 水题

    http://acm.fzu.edu.cn/problem.php?pid=2182 Problem 2182 水题 Accept: 188    Submit: 277Time Limit: 100 ...

  3. fzuoj Problem 2177 ytaaa

    http://acm.fzu.edu.cn/problem.php?pid=2177 Problem 2177 ytaaa Accept: 113    Submit: 265Time Limit: ...

  4. FZUOJ Problem 2178 礼品配送

    Problem 2178 礼物分配 题目链接: Click Here~ Problem Description 在双胞胎兄弟Eric与R.W的生日会上,他们共收到了N个礼物,生日过后他们决定分配这N个 ...

  5. FZUOJ Problem 2200 cleaning DP

    Problem 2200 cleaning  Problem Description N个人围成一圈在讨论大扫除的事情,需要选出K个人.但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距 ...

  6. 【BZOJ】【2179】FFT快速傅里叶

    FFT 做的第二道用到FFT的……好吧其实还是模板题-_-b 百度上说好像分治也能做……不过像FFT这种敲模板的还是省事=.= /*********************************** ...

  7. CSU2179&colon; 找众数

    Description 由文件给出N个1到30000间无序数正整数,其中1≤N≤10000,同一个正整数可能会出现多次,出现次数最多的整数称为众数.求出它的众数及它出现的次数. Input 输入文件第 ...

  8. 【BZOJ】2179&colon; FFT快速傅立叶(fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2179 fft裸题.... 为嘛我的那么慢....1000多ms.. #include <cst ...

  9. 【智能算法】用模拟退火&lpar;SA&comma; Simulated Annealing&rpar;算法解决旅行商问题 &lpar;TSP&comma; Traveling Salesman Problem&rpar;

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...

随机推荐

  1. ThinkPHP&lowbar;基础(1)目录结构

    (说明:文中的颜色一一对应) 目录结构 www WEB部署目录(或者子目录) ├─index.php 入口文件 ├─README.md README文件 ├─composer.json Compose ...

  2. HTML5 history API实践

    一.history API知识点总结 在HTML4中,我们已经可以使用window.history对象来控制历史记录的跳转,可以使用的方法包括: history.forward();//在历史记录中前 ...

  3. 模仿&dollar;&period;Callbacks实现

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. cursor&lowbar;sharing

    CURSOR_SHARING Property Description Parameter type String Syntax CURSOR_SHARING = { EXACT | FORCE } ...

  5. ExpandableListView&lpar;二&rpar;替换箭头图标被拉伸的问题

    之前写过一篇替换系统默认图标的文章,之后又发现了问题,当替换成自己的图片之后,图片被拉伸了!为了解决这个问题,我几乎尝试了所有方法,结果都不理想 我试过的方法,在布局里,把textview上的内容字体 ...

  6. 重写*之 kNN

    # !/usr/bin/python # -*- coding:utf-8 -*- """ Re-implement kNN algorithm as a practic ...

  7. 写给小前端er的nodejs&comma;mongodb后端小攻略~ &lpar;windows系统~&rpar;

    一.写在前面 迫于学校的压力,研二上准备回学校做实验发论文了,感觉真的没意思,这几天学着搞搞后端,踩了很多坑,整理一下这几天的坑以免以后再犯! 二.本文主要内容(由于是面向前端同学的,所以前端的内容就 ...

  8. 理解Linux系统负荷load average

    理解Linux系统负荷   一.查看系统负荷 如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了. 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行).(另外,它们在 ...

  9. 安全易用的云许可-VirboxLM许可管理平台

    Virbox LM是深思推出的基于云许可管理的开放平台,旨在为开发者提供低成本.高强度.操作便捷的一站式软件保护方案. Virbox LM包括用户许可管理工具.加壳工具.API帮助工具.开发商管理工具 ...

  10. StringBuffer、StringBuilder、冒泡与选择排序、二分查找、基本数据类型包装类&lowbar;DAY13

    1:数组的高级操作(预习) (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每个元素都有从0开始的编号,方便我们获取.专业名称:索引. (3)数组操作: A:遍历 public stat ...