日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P4127 [AHOI2009]同类分布

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4127 [AHOI2009]同类分布 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://www.luogu.org/problemnew/show/P4127

題目描述

給出兩個數?a,ba,b?,求出?[a,b][a,b]?中各位數字之和能整除原數的數的個數。

輸入輸出格式

輸入格式:

?

一行,兩個整數?aa?和?bb

?

輸出格式:

?

一個整數,表示答案

?

輸入輸出樣例

輸入樣例#1:?復制 10 19 輸出樣例#1:?復制 3

說明

對于所有的數據,?1 ≤ a ≤ b ≤ 10^18

題解:數位dp, 但有一個問題,我們不知道各個數位數字之和;18*9是很小的,我們枚舉一個一個試就可以了,這次學會了不用存頂上界,特判,情況少

#include<bits/stdc++.h> using namespace std; #define ll long long int digit[20]; ll dp[20][200][2][200]; ll dfs(int dep, int yu, int f, int t, int now, int sum){if(!dep) return !yu && sum == now;if(sum > now || sum + dep * 9 < now)return 0;if(dp[dep][yu][f][sum] != -1)return dp[dep][yu][f][sum];int i = f ? digit[dep] : 9;ll tmp = 0;for(; i >= 0; i--) {tmp += dfs(dep-1, (yu*10 + i) % now, f&(i == digit[dep]), i, now, sum+i);}return dp[dep][yu][f][sum] = tmp; }ll get(ll a){int cnt = 0;int now = 0;while(a){digit[++cnt] = a % 10;a /= 10;now += digit[cnt];}ll ans = 0;for(int i = 1; i <= 9*cnt; i++){memset(dp, -1, sizeof(dp));ans += dfs(cnt, 0, 1, 0, i, 0);} return ans; } // 1000000 7000000000000int main(){int kk = clock();ll L, R;cin>>L>>R;ll ans1 = get(L-1);ll ans2 = get(R);cout<<ans2-ans1<<endl;int cc = clock();//cout<<cc-kk; } View Code

?

轉載于:https://www.cnblogs.com/EdSheeran/p/9397195.html

總結

以上是生活随笔為你收集整理的P4127 [AHOI2009]同类分布的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。