【HDU 4507】吉哥系列故事——恨7不成妻
【題目】
Problem Description
單身!
依然單身!
吉哥依然單身!
DS 級碼農吉哥依然單身!
所以,他生平最恨情人節,不管是
還是
,他都討厭!
吉哥觀察了 和 這兩個數,發現:
最終,他發現原來這一切歸根到底都是因為和 有關!所以,他現在甚至討厭一切和 有關的數!
什麼樣的數和 有關呢?
如果一個整數符合下面 個條件之一,那麼我們就說這個整數和 有關——
- 整數中某一位是 ;
- 整數的每一位加起來的和是 的整數倍;
- 這個整數是 的整數倍;
現在問題來了:吉哥想知道在一定區間內和 無關的數字的平方和。
Input
輸入資料的第一行是 數 ( ),然後接下來的 行表示 個 ;每個 在一行內包含兩個正整數 ( )。
Output
請計算 [ , ] 中和 無關的數字的平方和,並將結果對 求模後輸出。
Sample Input
3
1 9
10 11
17 17
Sample Output
236
221
0
【分析】
終於把這道題弄出來了。。。
看到資料範圍,很顯然是一道數位 題
其實,如果只是統計與 無關的數的個數,就是常規操作,直接套板子就行了
但是現在是求平方和,該怎麼辦呢?
對每個節點都儲存一個三元組, 為合法的數的個數, 為合法的數的和, 為合法的數的平方和
首先,我們先思考簡單一點的,怎麼求與 無關的數的和
假設現在 到了第 位,這一位填的數為 ,那麼加上這一位 產生的貢獻,和就是
記錄的就是當前位置的和, 是不算上當前位置(就是之前的數的和)的和
現在就考慮如何算平方和( 表示不算上當前位,之前合法的數)
令 ,並拆開來化簡得到
可以發現, 就是 , 就是 ,有關於 的暴力計算就行了
【程式碼】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Mod 1000000007
using namespace std;
int a[20],Pow[20];
struct dp{long long num,sum,squ;}f[20][10][10][2];
dp search(int p,int v1,int v2,bool limit)
{
int i,up;
dp ans=(dp){0,0,0};
if(!p) return (dp){v1&&v2,0,0};
if(~f[p][v1][v2][limit].num) return f[p][v1][v2][limit];
up=limit?a[p]:9;
for(i=0;i<=up;++i)
{
if(i==7) continue;
dp temp=search(p-1,(v1+i)%7,(v2*10+i)%7,limit&&a[p]==i);
ans.num=(ans.num+temp.num)%Mod;
ans.sum=(ans.sum+temp.sum+1ll*i*Pow[p-1]%Mod*temp.num%Mod)%Mod;
ans.squ=(ans.squ+temp.squ+2ll*i*Pow[p-1]%Mod*temp.sum%Mod+temp.num*i*i%Mod*Pow[p-1]%Mod*Pow[p-1]%Mod)%Mod;
}
f[p][v1][v2][limit]=ans;
return ans;
}
long long solve(long long x)
{
int p=0;
while(x!=0)
{
a[++p]=x%10;
x/=10;
}
memset(f,-1,sizeof(